请具体说明你对 umi-request 请求库的改造和封装方案,尤其是全局请求拦截器和全局异常处理机制的设计与实现细节。
考察说明
考察候选人基于 umi-request 的封装能力,包括拦截器机制和异常处理链路的实现细节。
回答思路
- 【回答框架 1】umi-request 基于 fetch 封装,提供 request 和 use 方法,通过扩展中间件队列实现拦截器。全局请求拦截通过 request.use 注册请求拦截器,在发起前统一注入 token、公共参数或 headers,并可基于当前环境决定是否携带凭证。
- 【回答框架 2】全局异常处理通常注册错误拦截器,通过 response.use 统一处理 HTTP 状态码和业务错误码。拦截器按注册顺序执行,错误可被 catch 捕获,根据错误类型分别处理网络错误、超时和业务异常,并统一提示。
- 【回答框架 3】封装时我会定义统一的请求实例,支持配置超时、重试和取消机制。异常处理链路从前置拦截器、请求拦截器、响应拦截器到最终的 catch 分支,确保各环节职责单一。
- 【回答框架 4】实现时利用 umi-request 提供的拦截器 API,如 request.use 传入 async (url, options) 返回修改后的配置;响应拦截器处理数据格式解包、错误码判断和跳转登录逻辑。错误类型通过 AxiosError 或自定义错误码区分。
- 【关键点 1】请求拦截器在 fetch 前统一注入认证信息和公共参数,响应拦截器统一解包和校验状态码。
- 【关键点 2】异常分类处理:网络错误、HTTP 非 2xx、业务错误码、超时,分别返回或 throw 自定义错误。
- 【关键点 3】封装后提供统一的方法如 get、post,上层只需传入接口路径和参数,无需关心拦截逻辑。
- 【易错点 1】拦截器执行顺序易混淆,错误拦截器需在响应拦截器之后注册才能捕获错误。
- 【易错点 2】过度封装导致难以定位错误,需要保留原始错误信息并打印日志。
- 【易错点 3】中断请求链时未正确返回结果,可能导致调用方无法收尾。