chore: bump @kevisual/router to version 0.0.75, update QueryClient constructor, and enhance token handling in Query class

This commit is contained in:
2026-02-18 05:28:12 +08:00
parent 585becb6f5
commit 30245606d2
6 changed files with 56 additions and 97 deletions

View File

@@ -24,6 +24,8 @@ export type QueryOptions = {
headers?: Record<string, string>;
timeout?: number;
isClient?: boolean;
tokenName?: string;
storage?: Storage;
beforeRequest?: Fn;
}
export type Data = {
@@ -46,34 +48,11 @@ export type DataOpts = Partial<QueryOpts> & {
*/
noStop?: boolean;
};
/**
* 设置基础响应, 设置 success 和 showError,
* success 是 code 是否等于 200
* showError 是 如果 success 为 false 且 noMsg 为 false, 则调用 showError
* @param res 响应
*/
export const setBaseResponse = (res: Partial<Result & { success?: boolean; showError?: (fn?: () => void) => void; noMsg?: boolean }>) => {
res.success = res.code === 200;
/**
* 显示错误
* @param fn 错误处理函数
*/
res.showError = (fn?: () => void) => {
if (!res.success && !res.noMsg) {
fn?.();
}
};
return res as Result;
};
export const wrapperError = ({ code, message }: { code?: number; message?: string }) => {
const result = {
code: code || 500,
success: false,
message: message || 'api request error',
showError: (fn?: () => void) => {
//
},
noMsg: true,
message: message || '请求错误'
};
return result;
};
@@ -105,12 +84,13 @@ export class Query {
stop?: boolean;
// 默认不使用ws
qws: QueryWs;
/**
* 默认是 /client/router或者 默认是 /api/router
*/
isClient = false;
tokenName: string;
storage: Storage;
token: string;
constructor(opts?: QueryOptions) {
this.adapter = opts?.adapter || adapter;
this.tokenName = opts?.tokenName || 'token';
this.storage = opts?.storage || globalThis?.localStorage;
const defaultURL = opts?.isClient ? '/client/router' : '/api/router';
this.url = opts?.url || defaultURL;
this.headers = opts?.headers || {
@@ -121,7 +101,7 @@ export class Query {
this.beforeRequest = opts.beforeRequest;
} else {
this.beforeRequest = async (opts) => {
const token = globalThis?.localStorage?.getItem('token');
const token = this.token || this.storage?.getItem?.(this.tokenName);
if (token) {
opts.headers = {
...opts.headers,
@@ -162,7 +142,6 @@ export class Query {
*/
async post<R = any, P = any>(body: Data & P, options?: DataOpts): Promise<Result<R>> {
const url = options?.url || this.url;
console.log('query post', url, body, options);
const { headers, adapter, beforeRequest, afterResponse, timeout, ...rest } = options || {};
const _headers = { ...this.headers, ...headers };
const _adapter = adapter || this.adapter;
@@ -182,7 +161,7 @@ export class Query {
if (res === false) {
return wrapperError({
code: 500,
message: 'request is cancel',
message: '请求取消',
// @ts-ignore
req: req,
});
@@ -192,14 +171,14 @@ export class Query {
console.error('request beforeFn error', e, req);
return wrapperError({
code: 500,
message: 'api request beforeFn error',
message: '请求在请求前处理时发生错误',
// @ts-ignore
req: req,
});
}
if (this.stop && !options?.noStop) {
const that = this;
await new Promise((resolve) => {
const res = await new Promise((resolve) => {
let timer = 0;
const detect = setInterval(() => {
if (!that.stop) {
@@ -207,11 +186,21 @@ export class Query {
resolve(true);
}
timer++;
if (timer > 30) {
console.error('request stop: timeout', req.url, timer);
if (timer > 5) {
console.error('等待请求失败:', req.url, timer);
clearInterval(detect);
resolve(false);
}
}, 1000);
});
if (!res) {
return wrapperError({
code: 500,
message: '请求取消可能是因为用户未登录或者token过期',
// @ts-ignore
req: req,
});
}
}
return _adapter(req).then(async (res) => {
try {
@@ -225,10 +214,10 @@ export class Query {
return res;
} catch (e) {
console.error('request afterFn error', e, req);
console.error('请求在响应后处理时发生错误', e, req);
return wrapperError({
code: 500,
message: 'api request afterFn error',
message: '请求在响应后处理时发生错误',
// @ts-ignore
req: req,
});