Skip to content

拦截器管线

拦截器修改共享 FetchExchange,返回 void | Promise<void>,不返回替代 exchange。RequestInterceptorResponseInterceptorErrorInterceptorInterceptor 的结构化特例,必填 nameorderintercept(exchange)

注册与排序

new InterceptorRegistry(interceptors = []) 按 order 升序排序。use(interceptor): boolean 拒绝重复名称;eject(name): boolean 表示是否删除;clear(): void 清空全部条目。构造器排序的是初始数组的副本,不修改传入数组,也不会去重初始条目。interceptors 返回数组副本。intercept(exchange): Promise<void> 依次等待,拒绝时停止。注册表本身实现 Interceptor,name 为构造器名称,order 为 Number.MIN_SAFE_INTEGER

OrderedCapable.order 可选;sortOrder(a, b) 把缺失值视为零。toSorted(array, filter?) 返回排序副本,可选过滤。DEFAULT_INTERCEPTOR_ORDER_STEP = 1000BUILT_IN_INTERCEPTOR_ORDER_STEP = 10000 提供排序间隔。

内置阶段

注册表 / 实现导出的顺序值效果
request:RequestBodyInterceptorREQUEST_BODY_INTERCEPTOR_ORDER = MIN_SAFE_INTEGER + 10000规范化正文与 Content-Type。
request:UrlResolveInterceptorURL_RESOLVE_INTERCEPTOR_ORDER = MAX_SAFE_INTEGER - 20000解析基础路径、路径参数、查询,清空 urlParams。
request:FetchInterceptorFETCH_INTERCEPTOR_ORDER = MAX_SAFE_INTEGER - 10000等待 timeoutFetch 并赋值 response。
response:ValidateStatusInterceptorVALIDATE_STATUS_INTERCEPTOR_ORDER = MAX_SAFE_INTEGER - 10000除非绕过,否则拒绝不接受的状态。

对应 *_INTERCEPTOR_NAME 等于实现类名。order 为零的请求拦截器看到已规范化正文、尚未解析的 URL;order 为零的响应拦截器在默认状态校验之前运行。移除 FetchInterceptor 后不再执行内置 HTTP I/O;clear() 并非只移除自定义钩子。

失败与恢复

new InterceptorManager(validateStatus?) 创建上述请求/响应注册表和空错误注册表。exchange(exchange) 先运行 request,再运行 response。拒绝时将抛出的值放到 exchange.error,运行 error 注册表;若 hasError() 仍为真,则抛 ExchangeError

错误拦截器通过补齐所需响应/结果状态并清空 exchange.error 完成恢复。恢复后不会重跑响应链,因此恢复响应必须已满足应用策略。错误链自身抛错会直接传出,后续错误拦截器不再执行。错误拦截器不自动重试,提取器失败发生在此管理器之外。

共享客户端中的拦截器会一直保留直到移除。使用独立稳定名称,并在所有者结束时移除请求专属埋点;不要每次请求都追加新拦截器。

完整示例

ts
import { Fetcher, setHeader } from '@ahoo-wang/fetcher';

const client = new Fetcher({ baseURL: 'https://api.example.com' });
client.interceptors.request.use({
  name: 'trace',
  order: 0,
  intercept(exchange) {
    setHeader(exchange.ensureRequestHeaders(), 'X-Trace-Id', 'demo-trace');
  },
});
console.assert(client.interceptors.request.eject('trace'));

公开符号与源码

符号实现
FETCH_INTERCEPTOR_NAMEfetchInterceptor.ts:24
FETCH_INTERCEPTOR_ORDERfetchInterceptor.ts:30
FetchInterceptorfetchInterceptor.ts:54
DEFAULT_INTERCEPTOR_ORDER_STEPinterceptor.ts:18
BUILT_IN_INTERCEPTOR_ORDER_STEPinterceptor.ts:20
Interceptorinterceptor.ts:44
RequestInterceptorinterceptor.ts:111
ResponseInterceptorinterceptor.ts:135
ErrorInterceptorinterceptor.ts:164
InterceptorRegistryinterceptor.ts:189
InterceptorManagerinterceptorManager.ts:48
OrderedCapableorderedCapable.ts:29
sortOrderorderedCapable.ts:53
toSortedorderedCapable.ts:87
REQUEST_BODY_INTERCEPTOR_NAMErequestBodyInterceptor.ts:25
REQUEST_BODY_INTERCEPTOR_ORDERrequestBodyInterceptor.ts:30
RequestBodyInterceptorrequestBodyInterceptor.ts:50
URL_RESOLVE_INTERCEPTOR_NAMEurlResolveInterceptor.ts:24
URL_RESOLVE_INTERCEPTOR_ORDERurlResolveInterceptor.ts:29
UrlResolveInterceptorurlResolveInterceptor.ts:53

包索引

基于 Apache License 2.0 发布。