kbfetch 1.0.7 → 1.0.9

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 CHANGED
@@ -19,7 +19,7 @@ kbfetch.post('https://api.example.com/data', { id: 1 }, { params: { qa: 1 } })
19
19
  kbfetch.p('https://api.example.com/data', { params: { qa: 1 }, body: { id: 1 } })
20
20
  ```
21
21
 
22
- path参数
22
+ path 参数
23
23
 
24
24
  ```js
25
25
  kbfetch.get('https://baidu.com/:a/:b', { a: 1, b: 2 }).then(console.log)
@@ -27,7 +27,7 @@ kbfetch.post('https://baidu.com/:a/:b', { k: 2 }, { params: { a: 1, b: 2 } }).th
27
27
  kbfetch.p('https://api.example.com/:a/:b', { params: { a: 1, b: 2 }, body: { id: 1 } })
28
28
  ```
29
29
 
30
- 发起 其他method 请求的示例:
30
+ 发起 其他 method 请求的示例:
31
31
 
32
32
  ```js
33
33
  // e.g. 1
@@ -45,12 +45,13 @@ ft.abort()
45
45
 
46
46
  `or`
47
47
  `timeout>=0`
48
+
48
49
  ```js
49
50
  const ft = kbfetch.g('https://api.example.com/data', { params: { id: 1 }, timeout: 0 })
50
51
  ft.abort()
51
52
  ```
52
53
 
53
- 设置公共参数比如token
54
+ 设置公共参数比如 token
54
55
 
55
56
  ```js
56
57
  kbfetch.baseHeaders = { token: 'XXX' }
@@ -80,14 +81,14 @@ uploadFile: (url: string, file: File, init?: KbFetchInit)
80
81
 
81
82
  `KbFetchInit` 类型扩展了标准的 `RequestInit`,添加了一些可选的便捷属性:
82
83
 
83
- - `baseUrl` - API地址的公共前缀
84
- - `baseHeaders` - 公共的header,如token
85
- - `baseParams` - 公共的params,如企业微信的access_token,没有放在header里面,可以在这里设置
86
- - `baseBody` - 公共body
87
- - `timeout` - 请求超时时间(毫秒)
88
- - `before` - 修改/记录请求参数的回调函数
89
- - `parser` - 在返回resolve前解析响应的回调函数
90
- - `after` - 响应结果的回调函数
84
+ - `baseUrl` - API 地址的公共前缀
85
+ - `baseHeaders` - 公共的 header,如 token
86
+ - `baseParams` - 公共的 params,如企业微信的 access_token,没有放在 header 里面,可以在这里设置
87
+ - `baseBody` - 公共 body
88
+ - `timeout` - 请求超时时间(毫秒)
89
+ - `before` - 修改/记录请求参数的回调函数
90
+ - `parser` - 在返回 resolve 前解析响应的回调函数
91
+ - `after` - 响应结果的回调函数
91
92
 
92
93
  ```typescript
93
94
  import kbfetch, { createKbFetch, kbfc } from 'kbfetch'
@@ -124,11 +125,45 @@ const sse = (name: string, params: { ondata: (data: string) => any } & Record<st
124
125
  // 开始读取流信息
125
126
  return push()
126
127
  },
127
- after: v => v
128
+ after: v => v,
128
129
  })
129
130
  }
130
131
  ```
131
-
132
- 在这个示例中,我们自定义了 `before` 和 `after` 函数,以修改请求初始化对象和响应结果。
132
+ 无感知token刷新 实现示例:
133
+ ```javascript
134
+ let refreshTokenPromise
135
+ export const kfc = createKbFetch({
136
+ baseUrl: 'https://xxx.xxx',
137
+ after(res, req) {
138
+ return res.then(async res => {
139
+ // 此处使用401状态码表示token过期
140
+ if (res.status !== 401) return res.data
141
+ // @ts-ignore __retry 表示是否已经重试,避免多次触发
142
+ if (userInfo.refreshToken && !req.init.__retry) {
143
+ // @ts-ignore
144
+ req.init.__retry = true
145
+ const { userId, refreshToken } = userInfo
146
+ await (refreshTokenPromise ||= loginFetch
147
+ .post('refreshUserToken', {
148
+ user_id: userId,
149
+ refresh_token: refreshToken,
150
+ os: 'web',
151
+ ljappid: 2,
152
+ })
153
+ .then(({ data }) => {
154
+ // 重新设置token
155
+ kfc.baseHeaders.token = data
156
+ })
157
+ .finally(() => (refreshTokenPromise = undefined)))
158
+ return kfc.do(req.url, req.init)
159
+ }
160
+ // 此处可以,清除用户信息跳转登录页
161
+ console.warn('登录信息已过期,请重新登录')
162
+ return Promise.reject('token错误')
163
+ })
164
+ },
165
+ })
166
+ kfc.baseHeaders = { userId: 'xxx', token: 'xxx' }
167
+ ```
133
168
 
134
169
  更多关于 `kbfetchInit` 对象的详细信息,请参考原始的 TypeScript 定义文件。
package/dist/index.js CHANGED
@@ -72,7 +72,7 @@ var defaultKbFetch = {
72
72
  requestInit.headers && (requestInit.headers = help_default.obj2header(requestInit.headers));
73
73
  url = help_default.urlWithProtocol(url) ? url : help_default.addProtocol(baseUrl) + url;
74
74
  const response = fetch(url, requestInit).then(async (respnse) => Object.assign(respnse, { data: await parser(respnse) })).finally(() => clearTimeout(timeoutIns));
75
- return Object.assign(after(response), {
75
+ return Object.assign(after(response, { url, init }), {
76
76
  abort: () => abortController?.abort()
77
77
  });
78
78
  },
@@ -18,7 +18,10 @@ export interface DefaultKbFetch {
18
18
  before: <T extends any>(init: T) => T | void;
19
19
  after: (res: Promise<Response & {
20
20
  data: any;
21
- }>) => any;
21
+ }>, req: {
22
+ url: string;
23
+ init: KbFetchInit | undefined;
24
+ }) => any;
22
25
  parser: (res: Response) => any;
23
26
  timeout: number;
24
27
  do: <T>(url: string, init?: KbFetchInit) => Res<T>;
@@ -2,7 +2,10 @@ import { DefaultKbFetch } from './help';
2
2
  export declare const createKbFetch: (config: Partial<Pick<DefaultKbFetch, "baseUrl" | "baseParams" | "baseBody" | "timeout" | "before" | "parser" | "after">>) => {
3
3
  after: (res: Promise<Response & {
4
4
  data: any;
5
- }>) => any;
5
+ }>, req: {
6
+ url: string;
7
+ init: import("./help").KbFetchInit | undefined;
8
+ }) => any;
6
9
  before: <T extends any>(init: T) => T | void;
7
10
  timeout: number;
8
11
  baseUrl?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kbfetch",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.js",
6
6
  "devDependencies": {