UNPKG

@alicloud/console-fetcher-interceptor-res-biz

Version:
172 lines (138 loc) 4.13 kB
# @alicloud/console-fetcher-interceptor-res-biz > `@alicloud/console-fetcher` 的响应拦截器,封装业务错误。 * 扩展 `FetcherConfig` 增加可选方法(一般情况下不需要设置,除非「非正常」场景) + `isSuccess(o: IBizJson): boolean` + `getData(o: IBizJson): T` + `getCode(o: IBizJson): string` + `getRequestId(o: IBizJson): string` + `getTitle(o: IBizJson): string` + `getMessage(o: IBizJson): string` 阿里云控制台的 API 请求一般会以如下形式返回: ```typescript interface IBizJson<T> { code: string; requestId: string; data?: T; title?: string; message?: string; } ``` 其中 `code``'200'`(有些接口会是数字 `200`)的时候表示业务逻辑是成功的,这时候可以拿到 `data`;否则表示业务逻辑错误,这个时候可以拿到 `message`## INSTALL ```shell tnpm i @alicloud/console-fetcher-interceptor-res-biz -S ``` ## APIs ```typescript import createFetcher, { Fetcher } from '@alicloud/fetcher'; // import interceptors 1 import intercept, { FetcherConfigExtended } from '@alicloud/console-fetcher-interceptor-res-biz'; // import interceptors 2 const fetcher: Fetcher<FetcherConfigExtended> = createFetcher<FetcherConfigExtended>(); // ... add interceptors 1 intercept(fetcher); // ... add interceptors 2 export default fetcher ``` ## 对 `@alicloud/fetcher` 的扩展 ### FetcherConfig 可以在 config 对象上传入新增参数: ```typescript interface FetcherConfigExtra { /** * 判断请求是否成功,默认判断 `json.code === '200' || json.code === 200` * * - `boolean` 直接成功或失败 * - `(json: any) => boolean` 根据原始 json 对象进行自定义判断 */ isSuccess?: boolean | ((json: any) => boolean); /** * 提取最终需要的数据,默认 `json.data` * * - `string` 自定义数据字段,如 `'DATA'` 则表示获取 `json.DATA` * - `(json: any) => any` 从原始 json 对象进行自定义提取 */ getData?: string | ((json: any) => any); /** * 当 `isSuccess` 判定为失败时,从数据中提取错误 code,默认 `json.code` * * - `string` 自定义数据字段,如 `'DATA'` 则表示获取 `json.DATA` * - `(json: any) => any` 从原始 json 对象进行自定义提取 */ getCode?: string | ((json: any) => string); /** * 当 `isSuccess` 判定为失败时,从数据中提取错误 message,默认 `json.message` * * - `string` 自定义数据字段,如 `'MESSAGE'` 则表示获取 `json.MESSAGE` * - `(json: any) => any` 从原始 json 对象进行自定义提取 */ getMessage?: string | ((json: any) => string); } ``` ### 错误名 `ERROR_BIZ = 'FetcherErrorBiz'` ## 如何覆盖默认设置 ### 方法 1 - 创建实例时传入默认值 假设 `~` 是你项目下 `src`alias。 创建自己的 Fetcher 实例,传入默认值: ```typescript import createFetcher, { Fetcher } from '@alicloud/fetcher'; // import interceptors 1 import intercept, { FetcherConfigExtended } from '@alicloud/console-fetcher-interceptor-res-biz'; // import interceptors 2 const fetcher: Fetcher<FetcherConfigExtended> = createFetcher<FetcherConfigExtended>({ isSuccess?, getData?, getCode?, getRequestId?, getTitle?, getMessage? }); // ... add interceptors 1 intercept(fetcher); // ... add interceptors 2 export default fetcher; ``` ### 方法 2 - 调用的时候传入覆盖 ```typescript import fetcher from '~/util/fetcher'; // 假设这是你项目下的 fetcher 文件路径 interface IResult { id: string; name: string; } interface IBody { id: string; } fetcher.request<IResult>({ url: '____url____', isSuccess?, getData?, getCode?, getRequestId?, getTitle?, getMessage? }); fetcher.post<IResult, IBody>({ isSuccess?, getData?, getCode?, getRequestId?, getTitle?, getMessage? }, '____url____', { id: '____id____' }); // 假设有一个 JSONP 请求,它的返回直接就是数据(即没有业务错误): fetcher.jsonp({ isSuccess: true, getData: json => json }, '____url____') ```