feat: 支持GET请求 因为GET的请求可以缓存

This commit is contained in:
xion 2025-03-22 13:19:40 +08:00
parent dcab87c77a
commit 8f85ed4d4d
3 changed files with 34 additions and 22 deletions

View File

@ -1,6 +1,6 @@
{
"name": "@kevisual/query",
"version": "0.0.13",
"version": "0.0.14",
"main": "dist/index.js",
"module": "dist/index.js",
"types": "dist/index.d.ts",

View File

@ -1,8 +1,11 @@
type AdapterOpts = {
export const methods = ['GET', 'POST'] as const;
export type Method = (typeof methods)[number];
export type AdapterOpts = {
url: string;
headers?: Record<string, string>;
body?: Record<string, any>;
timeout?: number;
method?: Method;
};
/**
@ -18,16 +21,21 @@ export const adapter = async (opts: AdapterOpts, overloadOpts?: RequestInit) =>
const timer = setTimeout(() => {
controller.abort();
}, timeout);
return fetch(opts.url, {
method: 'POST',
let method = overloadOpts?.method || opts.method || 'POST';
let url = new URL(opts.url, window.location.origin);
const isGet = method === 'GET';
if (isGet) {
url.search = new URLSearchParams(opts.body).toString();
}
return fetch(url, {
method: method.toUpperCase(),
headers: {
'Content-Type': 'application/json',
...opts.headers,
},
body: JSON.stringify(opts.body),
signal,
...overloadOpts,
body: isGet ? undefined : JSON.stringify(opts.body),
})
.then((response) => {
// 获取 Content-Type 头部信息

View File

@ -1,4 +1,4 @@
import { adapter } from './adapter.ts';
import { adapter, Method } from './adapter.ts';
/**
*
* @param opts
@ -17,6 +17,8 @@ export type QueryOpts = {
adapter?: typeof adapter;
headers?: Record<string, string>;
timeout?: number;
method?: Method;
[key: string]: any;
};
export type Data = {
path?: string;
@ -76,7 +78,7 @@ export const setBaseResponse = (res: Result) => {
export class Query {
adapter: typeof adapter;
url: string;
beforeRequest?: Fn;
beforeRequest?: DataOpts['beforeRequest'];
afterResponse?: DataOpts['afterResponse'];
headers?: Record<string, string>;
timeout?: number;
@ -120,20 +122,22 @@ export class Query {
*/
async post<R = any, P = any>(body: Data & P, options?: DataOpts): Promise<Result<R>> {
const url = options?.url || this.url;
const headers = { ...this.headers, ...options?.headers };
const adapter = options?.adapter || this.adapter;
const beforeRequest = options?.beforeRequest || this.beforeRequest;
const afterResponse = options?.afterResponse || this.afterResponse;
const timeout = options?.timeout || this.timeout;
const { headers, adapter, beforeRequest, afterResponse, timeout, ...rest } = options || {};
const _headers = { ...this.headers, ...headers };
const _adapter = adapter || this.adapter;
const _beforeRequest = beforeRequest || this.beforeRequest;
const _afterResponse = afterResponse || this.afterResponse;
const _timeout = timeout || this.timeout;
const req = {
url: url,
headers: headers,
headers: _headers,
body,
timeout,
timeout: _timeout,
...rest,
};
try {
if (beforeRequest) {
await beforeRequest(req);
if (_beforeRequest) {
await _beforeRequest(req);
}
} catch (e) {
console.error('request beforeFn error', e, req);
@ -160,11 +164,11 @@ export class Query {
}, 1000);
});
}
return adapter(req).then(async (res) => {
return _adapter(req).then(async (res) => {
try {
setBaseResponse(res);
if (afterResponse) {
return await afterResponse(res, {
if (_afterResponse) {
return await _afterResponse(res, {
req,
res,
fetch: adapter,
@ -187,14 +191,14 @@ export class Query {
*
* @param fn
*/
before(fn: Fn) {
before(fn: DataOpts['beforeRequest']) {
this.beforeRequest = fn;
}
/**
*
* @param fn
*/
after(fn: (result: Result, req?: any) => Promise<any>) {
after(fn: DataOpts['afterResponse']) {
this.afterResponse = fn;
}
}