← [ BACK_TO_NOTES ]

Axios 封装实践

保留 DailyUse 早期 HTTP 客户端设计背景,并依据 MemoFlow 固定提交核对 Axios 工厂、Result 信封和刷新队列的当前实现及边界。

#synthesis #growing #network #browser #http #javascript #axios

[!info] related notes

Axios 封装实践

这篇记录 DailyUse / MemoFlow 的 HTTP 客户端实践。DailyUse 是旧仓库名称,身份与迁移入口见 [private note]、MemoFlow。

历史背景与核对范围

2026-04-07 的原记录描述了 @dailyuse/http-client、AxiosHttpClient 与 ResultHttpClient 两种封装,以及 Web/Pinia Token 刷新集成。原文还记录由 authenticationStore 延迟取 Token、使用独立 fetch 刷新以避开拦截链、store.$patch 更新状态,以及刷新失败后清空状态并跳转登录。这些是早期设计记录,不代表当前文件和应用集成仍保持原样。

2026-10-07 只读核对本地 MemoFlow 固定提交 3664f8da6a95174d24ae8f443f2d12b3ce223e33:

  • packages/http-client 现使用 @memoflow/http-client 名称。
  • 源码包含 axios-instance.ts、result-http-client.ts、result-error.ts、types.ts 等;该快照没有原文所述 axios-http-client.ts。
  • 本次确认的是源码结构与控制路径,不证明某个线上部署已运行此版本,也未重新验证早期 Pinia 集成。

实例工厂与 Token 注入

createAxiosInstance 通过 axios.create 建立独立实例,设置 baseURL、timeout 与默认 JSON Content-Type,再展开 axiosConfig;外部配置因此可以覆盖这些顶层选项。

请求拦截器通过 tokenProvider.getAccessToken() 延迟取令牌,再设置 Authorization。延迟读取可获得更新后的 Token,但本身不保证目标地址可信;baseURL 默认可被绝对 URL 覆盖。上传场景也需避免让 JSON 默认值覆盖正确的表单编码,见 Axios 数据序列化。

Result 信封处理

ResultHttpClient 的 request/get/post 等方法通过 execute 包装 Axios 调用。成功响应在 handleSuccess 中检查业务信封并转换为 Result:不符合预期信封的原始 payload 返回 INTERNAL_ERROR,而非直接透传。

这与“响应拦截器直接返回 data”不同:该快照的响应拦截器主要处理 401,Result 转换发生在 execute/handleSuccess 路径。

信封检查主要识别 ok 与 data/error 等外形,不证明泛型 T 的业务字段已经验证。Promise<Result<T>> 让调用方区分成功和失败,不等于 TypeScript 强制处理每个错误;副作用回调本身的异常也需要明确契约。

401 并发刷新队列

固定快照中的流程:

  1. 响应为 401、存在刷新回调且原请求未标记 _retried 时,进入 handleTokenRefresh。
  2. 已在刷新中的请求进入 refreshQueue,等待新 Token。
  3. 发起者设置 isRefreshing 和自身的 _retried,再调用 onTokenRefresh。
  4. 成功后给原请求和等待者设置新 Authorization 并重放;失败则拒绝等待者并调用 onUnauthorized。
  5. finally 清除 isRefreshing;drainRefreshQueue 负责结束等待者并清空队列。

不能从这段实现推出的保证

  • 排队分支没有像发起者一样先设置 _retried,不能宣称每个请求最多只触发一次刷新;持续 401 的重放需要专门验证。
  • 队列只有单实例内共享,不是跨标签页、跨客户端或多进程锁。
  • 源码中的刷新等待队列没有展示独立的截止时间/取消移除机制,不能宣称所有等待者都会及时结束。
  • Token 注入会再次执行,刷新回调需与 TokenProvider 状态一致,否则重放请求仍可能拿到旧值。
  • 重放写请求需要业务幂等和服务端认证语义保障;刷新成功不证明原副作用没有发生。

这些是该源码快照的观察与验证点,不是已经实施的修复。通用返回、取消与刷新边界见 Axios 封装模式。

源码依据

  • MemoFlow HTTP 客户端固定快照
  • 工厂:axios-instance.ts 中 createAxiosInstance。
  • Result 与刷新:result-http-client.ts 中 execute、handleSuccess、setupResponseInterceptor、handleTokenRefresh、drainRefreshQueue。
创建于 2026/4/7 更新于 2026/10/7
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本