From 14dec5f5c573f3f09f5162188ecd34dda9a1d573 Mon Sep 17 00:00:00 2001 From: xion Date: Sat, 7 Jun 2025 17:00:30 +0800 Subject: [PATCH] add query adapter --- package.json | 2 +- src/adapter.ts | 18 +++++++++++++++--- src/query.ts | 3 ++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 76d6132..9ee756b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/query", - "version": "0.0.25", + "version": "0.0.26", "main": "dist/index.js", "module": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/adapter.ts b/src/adapter.ts index 1ae44ab..540f7fa 100644 --- a/src/adapter.ts +++ b/src/adapter.ts @@ -1,12 +1,15 @@ export const methods = ['GET', 'POST'] as const; export type Method = (typeof methods)[number]; + +type SimpleObject = Record; export type AdapterOpts = { url?: string; headers?: Record; - body?: Record; + body?: Record | FormData; // body 可以是对象、字符串或 FormData timeout?: number; method?: Method; isBlob?: boolean; // 是否返回 Blob 对象 + isPostFile?: boolean; // 是否为文件上传 }; export const isTextForContentType = (contentType: string | null) => { if (!contentType) return false; @@ -23,6 +26,7 @@ export const adapter = async (opts: AdapterOpts, overloadOpts?: RequestInit) => const controller = new AbortController(); const signal = controller.signal; const isBlob = opts.isBlob || false; // 是否返回 Blob 对象 + const isPostFile = opts.isPostFile || false; // 是否为文件上传 const timeout = opts.timeout || 60000 * 3; // 默认超时时间为 60s * 3 const timer = setTimeout(() => { controller.abort(); @@ -38,7 +42,15 @@ export const adapter = async (opts: AdapterOpts, overloadOpts?: RequestInit) => } const isGet = method === 'GET'; if (isGet) { - url.search = new URLSearchParams(opts.body).toString(); + url.search = new URLSearchParams(opts.body as SimpleObject).toString(); + } + let body: string | FormData | undefined = undefined; + if (isGet) { + body = undefined; + } else if (isPostFile) { + body = opts.body as FormData; // 如果是文件上传,直接使用 FormData + } else { + body = JSON.stringify(opts.body); // 否则将对象转换为 JSON 字符串 } return fetch(url, { method: method.toUpperCase(), @@ -48,7 +60,7 @@ export const adapter = async (opts: AdapterOpts, overloadOpts?: RequestInit) => }, signal, ...overloadOpts, - body: isGet ? undefined : JSON.stringify(opts.body), + body: body, }) .then(async (response) => { // 获取 Content-Type 头部信息 diff --git a/src/query.ts b/src/query.ts index f574eeb..ef8a98b 100644 --- a/src/query.ts +++ b/src/query.ts @@ -16,10 +16,11 @@ export type Fn = (opts: { export type QueryOpts = { url?: string; headers?: Record; - body?: Record; + body?: Record | FormData; // body 可以是对象、字符串或 FormData timeout?: number; method?: Method; isBlob?: boolean; // 是否返回 Blob 对象 + isPostFile?: boolean; // 是否为文件上传 adapter?: typeof adapter; [key: string]: any;