diff --git a/README.md b/README.md index 5062d78..6b55827 100644 --- a/README.md +++ b/README.md @@ -217,6 +217,22 @@ export default [ }, }, }, + { + url: '/api/text', + method: 'post', + rawResponse: async (req, res) => { + let reqbody = ''; + await new Promise((resolve) => { + req.on('data', (chunk) => { + reqbody += chunk; + }); + req.on('end', () => resolve(undefined)); + }); + res.setHeader('Content-Type', 'text/plain'); + res.statusCode = 200; + res.end(`hello, ${reqbody}`); + }, + }, ] as MockMethod[]; ``` @@ -232,8 +248,10 @@ export default [ timeout?: number; // default: 200 statusCode?:number; - // response data - response: ((opt: { [key: string]: string; body: Record; query: Record, headers: Record; }) => any) | any; + // response data (JSON) + response?: ((opt: { [key: string]: string; body: Record; query: Record, headers: Record; }) => any) | any; + // response (non-JSON) + rawResponse?: (req: IncomingMessage, res: ServerResponse) => void; } ``` diff --git a/README.zh_CN.md b/README.zh_CN.md index fcf0647..3d8a204 100644 --- a/README.zh_CN.md +++ b/README.zh_CN.md @@ -200,6 +200,22 @@ export default [ }, }, }, + { + url: '/api/text', + method: 'post', + rawResponse: async (req, res) => { + let reqbody = ''; + await new Promise((resolve) => { + req.on('data', (chunk) => { + reqbody += chunk; + }); + req.on('end', () => resolve(undefined)); + }); + res.setHeader('Content-Type', 'text/plain'); + res.statusCode = 200; + res.end(`hello, ${reqbody}`); + }, + }, ] as MockMethod[]; ``` @@ -215,8 +231,10 @@ export default [ timeout?: number; // 状态吗 statusCode?:number; - // 响应数据 - response: ((opt: { [key: string]: string; body: Record; query: Record, headers: Record; }) => any) | any; + // 响应数据(JSON) + response?: ((opt: { [key: string]: string; body: Record; query: Record, headers: Record; }) => any) | any; + // 响应(非JSON) + rawResponse?: (req: IncomingMessage, res: ServerResponse) => void; } ``` diff --git a/src/createMockServer.ts b/src/createMockServer.ts index 755216d..61d755f 100644 --- a/src/createMockServer.ts +++ b/src/createMockServer.ts @@ -59,7 +59,7 @@ export async function requestMiddleware(opt: ViteMockOptions) { }); if (matchRequest) { - const { response, timeout, statusCode, url } = matchRequest; + const { response, rawResponse, timeout, statusCode, url } = matchRequest; if (timeout) { await sleep(timeout); @@ -74,13 +74,17 @@ export async function requestMiddleware(opt: ViteMockOptions) { } } - const body = await parseJson(req); - const mockResponse = isFunction(response) - ? response({ body, query, headers: req.headers }) - : response; - res.setHeader('Content-Type', 'application/json'); - res.statusCode = statusCode || 200; - res.end(JSON.stringify(Mock.mock(mockResponse))); + if (isFunction(rawResponse)) { + await rawResponse(req, res); + } else { + const body = await parseJson(req); + const mockResponse = isFunction(response) + ? response({ body, query, headers: req.headers }) + : response; + res.setHeader('Content-Type', 'application/json'); + res.statusCode = statusCode || 200; + res.end(JSON.stringify(Mock.mock(mockResponse))); + } logger && loggerOutput('request invoke', req.url!); return; diff --git a/src/types.ts b/src/types.ts index 5c5494a..fe7b402 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,5 @@ +import { IncomingMessage, ServerResponse } from 'node:http'; + export interface ViteMockOptions { mockPath?: string; configPath?: string; @@ -20,7 +22,8 @@ export declare interface MockMethod { method?: MethodType; timeout?: number; statusCode?: number; - response: ((opt: { body: Recordable; query: Recordable; headers: Recordable }) => any) | any; + response?: ((opt: { body: Recordable; query: Recordable; headers: Recordable }) => any) | any; + rawResponse?: (req: IncomingMessage, res: ServerResponse) => void; } export interface NodeModuleWithCompile extends NodeModule { diff --git a/src/utils.ts b/src/utils.ts index 0724be6..6e585dd 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -6,7 +6,7 @@ export function is(val: unknown, type: string) { // eslint-disable-next-line export function isFunction(val: unknown): val is T { - return is(val, 'Function'); + return is(val, 'Function') || is(val, 'AsyncFunction'); } export function isArray(val: any): val is Array {