@polyv/request-plugin-status-code 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # StatusCodeRequestPlugin
2
+
3
+ 用途:对后端返回的 code 进行处理,并返回 Response 中的 data
4
+
5
+ ## 实例化参数
6
+
7
+ | 参数名 | 用途 | 类型 | 默认值 |
8
+ | - | - | - | - |
9
+ | `successCode` | 请求成功状态码 | `number \| number[]` | `200` |
10
+ | `fields` | 状态码字段配置 | `StatusCodeFields` | 见下文 |
11
+ | `errorCallback` | 请求失败回调函数 | `function` | - |
12
+
13
+ ## 请求选项
14
+
15
+ | 参数名 | 用途 | 类型 | 默认值 |
16
+ | - | - | - | - |
17
+ | `useStatusCode` | 是否使用状态码判断 | `boolean` | `true` |
18
+ | `successCode` | 成功状态码 | `number \| number[]` | - |
19
+
20
+ ## 状态码字段配置
21
+
22
+ `StatusCodeFields` 类型如下:
23
+
24
+ | 参数名 | 用途 | 类型 | 默认值 |
25
+ | - | - | - | - |
26
+ | `codeField` | 状态码字段名 | `string` | `'code'` |
27
+ | `statusField` | 状态字段名 | `string` | `'status'` |
28
+ | `messageField` | 消息字段名 | `string` | `'message'` |
29
+ | `dataField` | 数据字段名 | `string` | `'data'` |
30
+ | `errorField` | 错误对象字段名 | `string` | `'error'` |
31
+ | `errorCodeField` | 错误对象中的错误码字段名 | `string` | `'code'` |
32
+ | `errorDescField` | 错误对象中的错误描述字段名 | `string` | `'desc'` |
33
+
34
+ ## 使用方式
35
+
36
+ ```js
37
+ import { PolyvRequest } from '@polyv/request-core';
38
+ import { StatusCodeRequestPlugin } from '@polyv/request-plugin-status-code';
39
+
40
+ // 基础用法
41
+ const requester = new PolyvRequest({
42
+ requestPlugins: [
43
+ new StatusCodeRequestPlugin(),
44
+ ]
45
+ });
46
+
47
+ // 自定义成功状态码
48
+ const requester = new PolyvRequest({
49
+ requestPlugins: [
50
+ new StatusCodeRequestPlugin({
51
+ successCode: [200, 0],
52
+ }),
53
+ ]
54
+ });
55
+
56
+ // 自定义字段名
57
+ const requester = new PolyvRequest({
58
+ requestPlugins: [
59
+ new StatusCodeRequestPlugin({
60
+ fields: {
61
+ codeField: 'errorCode',
62
+ dataField: 'result',
63
+ messageField: 'msg',
64
+ },
65
+ }),
66
+ ]
67
+ });
68
+
69
+ // 添加错误处理回调
70
+ const requester = new PolyvRequest({
71
+ requestPlugins: [
72
+ new StatusCodeRequestPlugin({
73
+ errorCallback: (code, message) => {
74
+ console.error(`请求失败: ${code} - ${message}`);
75
+ },
76
+ }),
77
+ ]
78
+ });
79
+
80
+ interface PeopleInfo {
81
+ name: string;
82
+ }
83
+ // 如果后端接口返回的 Response:{ code: 200, data: { name: string } }
84
+ const data = await requester.get<PeopleInfo>('/api/data', {});
85
+ // 此时无需做 code 判断,直接得到 data 的内容
86
+ console.log('名称', data.name);
87
+
88
+ // 如果你想在某个请求中不使用状态码判断
89
+ requester.get('/api/data', {}, {
90
+ useStatusCode: false,
91
+ });
92
+ ```
93
+
94
+ ## 响应处理逻辑
95
+
96
+ 1. 插件会解析接口返回的数据,提取 `code`、`status`、`message`、`data` 等字段
97
+ 2. 当满足以下条件之一时,请求被视为成功:
98
+ - 返回的 `code` 值在成功状态码列表中
99
+ - 返回的 `status` 值为 `'success'`
100
+ 3. 成功时直接返回 `data` 字段的内容
101
+ 4. 失败时抛出错误,错误信息包含:
102
+ - `code`: 优先使用 `error.code` 字段,其次使用顶层 `code` 字段
103
+ - `message`: 优先使用 `error.desc` 字段,其次使用顶层 `message` 字段,都不存在则为 `'未知错误'`
104
+
package/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './status-code-plugin';
2
+ export * from './types';
3
+ export * from './request-options';
package/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './status-code-plugin';
2
+ export * from './types';
3
+ export * from './request-options';
package/package.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "@polyv/request-plugin-status-code",
3
+ "version": "2.0.0",
4
+ "main": "./index.js",
5
+ "dependencies": {
6
+ "@polyv/request-core": "2.0.0"
7
+ },
8
+ "types": "./index.d.ts"
9
+ }
@@ -0,0 +1,21 @@
1
+ export interface StatusCodeRequestOptions {
2
+ /**
3
+ * 是否使用 status-code 判断返回
4
+ * @default true
5
+ * @plugin `StatusCodeRequestPlugin`
6
+ */
7
+ useStatusCode?: boolean;
8
+ /**
9
+ * 成功状态码
10
+ * @plugin `StatusCodeRequestPlugin`
11
+ */
12
+ successCode?: number | number[];
13
+ }
14
+ declare module '@polyv/request-core' {
15
+ interface RequestCustomOptions extends StatusCodeRequestOptions {
16
+ }
17
+ }
18
+ declare module 'axios' {
19
+ interface AxiosRequestConfig extends StatusCodeRequestOptions {
20
+ }
21
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import type { RequestOptions, RequestPlugin, RequestResult } from '@polyv/request-core';
2
+ import { StatusCodeRequestPluginConfig } from './types';
3
+ /**
4
+ * 状态码处理插件
5
+ */
6
+ export declare class StatusCodeRequestPlugin implements RequestPlugin {
7
+ private __fields;
8
+ private __successCodes;
9
+ private __errorCallback?;
10
+ constructor(config?: StatusCodeRequestPluginConfig);
11
+ usePlugin(options: RequestOptions): boolean;
12
+ interceptResponse(result: RequestResult, options: RequestOptions): Promise<RequestResult>;
13
+ private __formatRes;
14
+ /**
15
+ * 格式化 successCode,返回数组类型的状态码
16
+ * @param target
17
+ */
18
+ private __formateSuccessCode;
19
+ private __getSuccessCodes;
20
+ }
@@ -0,0 +1,91 @@
1
+ import { createRequestError } from '@polyv/request-core';
2
+ /**
3
+ * 状态码处理插件
4
+ */
5
+ export class StatusCodeRequestPlugin {
6
+ __fields;
7
+ __successCodes;
8
+ __errorCallback;
9
+ constructor(config = {}) {
10
+ this.__successCodes = this.__formateSuccessCode(config.successCode ?? 200);
11
+ this.__errorCallback = config.errorCallback;
12
+ this.__fields = {
13
+ codeField: 'code',
14
+ statusField: 'status',
15
+ messageField: 'message',
16
+ dataField: 'data',
17
+ errorField: 'error',
18
+ errorCodeField: 'code',
19
+ errorDescField: 'desc',
20
+ ...config.fields,
21
+ };
22
+ }
23
+ usePlugin(options) {
24
+ const { useStatusCode = true } = options;
25
+ return useStatusCode;
26
+ }
27
+ interceptResponse(result, options) {
28
+ if (!result.data) {
29
+ throw new Error(`status-code-plugin error: result.data is undefined, url: ${options.requestUrl}`);
30
+ }
31
+ const data = this.__formatRes(result.data);
32
+ const apiCode = data.code;
33
+ const apiStatus = data.status;
34
+ const successCodes = this.__getSuccessCodes(options);
35
+ if (successCodes.includes(apiCode) || apiStatus === 'success') {
36
+ return Promise.resolve({
37
+ ...result,
38
+ data: data.data,
39
+ });
40
+ }
41
+ const code = data.error?.code || apiCode;
42
+ const message = data.error?.desc || data.message || '未知错误';
43
+ const error = createRequestError({
44
+ code,
45
+ message,
46
+ });
47
+ if (this.__errorCallback) {
48
+ this.__errorCallback(code, message);
49
+ }
50
+ return Promise.reject(error);
51
+ }
52
+ __formatRes(target) {
53
+ const code = target[this.__fields.codeField];
54
+ const status = target[this.__fields.statusField];
55
+ const message = target[this.__fields.messageField];
56
+ const data = target[this.__fields.dataField];
57
+ const result = {
58
+ code,
59
+ data,
60
+ status,
61
+ message,
62
+ };
63
+ const error = target[this.__fields.errorField];
64
+ if (error) {
65
+ const errorCode = error[this.__fields.errorCodeField];
66
+ const errorDesc = error[this.__fields.errorDescField];
67
+ result.error = {
68
+ code: errorCode,
69
+ desc: errorDesc,
70
+ };
71
+ }
72
+ return result;
73
+ }
74
+ /**
75
+ * 格式化 successCode,返回数组类型的状态码
76
+ * @param target
77
+ */
78
+ __formateSuccessCode(target) {
79
+ if (typeof target === 'number') {
80
+ return [target];
81
+ }
82
+ else if (Array.isArray(target)) {
83
+ return target;
84
+ }
85
+ return [];
86
+ }
87
+ __getSuccessCodes(options) {
88
+ const optionsSuccessCodes = this.__formateSuccessCode(options.successCode);
89
+ return [...this.__successCodes, ...optionsSuccessCodes];
90
+ }
91
+ }
package/types.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ export interface StatusCodeRequestPluginConfig {
2
+ /**
3
+ * 请求成功状态码
4
+ * @default 200
5
+ */
6
+ successCode?: number | number[];
7
+ /**
8
+ * 状态码字段
9
+ */
10
+ fields?: StatusCodeFields;
11
+ /**
12
+ * 请求失败回调
13
+ */
14
+ errorCallback?: StatusCodeErrorCallback;
15
+ }
16
+ export interface StatusCodeFields {
17
+ codeField?: string;
18
+ statusField?: string;
19
+ messageField?: string;
20
+ dataField?: string;
21
+ errorField?: string;
22
+ errorCodeField?: string;
23
+ errorDescField?: string;
24
+ }
25
+ export type StatusCodeErrorCallback = (code: number | undefined, message: string) => unknown;
26
+ export interface PolyvResponseType {
27
+ code: number;
28
+ data: unknown;
29
+ status?: string;
30
+ message?: string;
31
+ error?: {
32
+ code?: number;
33
+ desc?: string;
34
+ };
35
+ }
package/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};