chore: bump @kevisual/router to version 0.0.75, update QueryClient constructor, and enhance token handling in Query class
This commit is contained in:
65
src/query.ts
65
src/query.ts
@@ -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,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user