@web_xiaobai/request
v0.0.1
Published
多项目通用的 axios 封装:可注入 `getToken` / `refreshToken`、401 排队刷新、重复请求取消、失败重试、URL 与前缀拼接等(合并自 VAxios 实用能力,无业务路径依赖)。
Readme
@web_xiaobai/request
多项目通用的 axios 封装:可注入 getToken / refreshToken、401 排队刷新、重复请求取消、失败重试、URL 与前缀拼接等(合并自 VAxios 实用能力,无业务路径依赖)。
安装
pnpm add @web_xiaobai/request axios基础用法
import { createRequest, SKIP_AUTH_REFRESH, ContentTypeEnum } from "@web_xiaobai/request"
import to from "await-to-js"
const request = createRequest({
baseURL: import.meta.env.VITE_API_BASE,
authenticationScheme: "Bearer",
withCredentials: true,
headers: { "Content-Type": ContentTypeEnum.Json },
getToken: () => localStorage.getItem("access_token"),
refreshToken: async client => {
const { data } = await client.post(
"/auth/refresh",
{ refreshToken: localStorage.getItem("refresh_token") },
SKIP_AUTH_REFRESH
)
localStorage.setItem("access_token", data.accessToken)
return { accessToken: data.accessToken }
},
onUnauthorized: () => router.push("/login"),
onForbidden: () => message.error("暂无权限"),
skipRefreshUrls: ["/auth/refresh"],
requestOptions: {
joinTime: true,
formatDate: true,
ignoreCancelToken: false,
retry: { count: 0, delay: 1000 }
},
// 按后端约定解包 { code, data, msg }
transformRequestHook: res => {
const body = res.data as { code: number; data: unknown; msg?: string }
if (body.code === 200) return body.data
throw new Error(body.msg ?? "请求失败")
}
})
const [err, data] = await to(request.get({ url: "/api/user" }))从 VAxios 合并的能力
| 能力 | 说明 |
|------|------|
| beforeRequestHook | apiUrl / urlPrefix、GET 时间戳、params→data |
| ignoreCancelToken | false 时同 URL 新请求会 abort 上一个(AbortController) |
| retry | 非 401/403 失败按次数延迟重试 |
| transformRequestHook | 成功响应数据转换 |
| get/post/put/delete/patch/upload | 便捷方法 |
| request.cancelAll() | 取消所有 pending |
| request.getAxios() | 拿原始 AxiosInstance |
脚本
pnpm lib:request