【发布时间】:2023-02-03 07:45:05
【问题描述】:
在下面的代码中,我想使用来自 zod 的模式验证请求主体,目前,它将失败并捕获。这是因为 req.body 返回的是 ReadableStream<Uint8Array> 而不是它期望解析的对象。
export default async function middleware(req: NextRequest, res: NextResponse) {
const { pathname } = req.nextUrl;
if (pathname.startsWith('/api/user/create')) {
try {
createUserSchema.parse({
body: req.body,
params: req.nextUrl.searchParams,
});
return NextResponse.next();
} catch (error: any) {
console.log(req.body);
return NextResponse.json(
{ success: false, message: error },
{ status: 422, headers: { 'content-type': 'application/json' } }
);
}
}
return NextResponse.next();
}
下面是 console.log(req.body); 的输出
<ref *1> ReadableStream {
_state: 'readable',
_reader: undefined,
_storedError: undefined,
_disturbed: false,
_readableStreamController: ReadableStreamDefaultController {
_controlledReadableStream: [Circular *1],
_queue: S {
_cursor: 0,
_size: 0,
_front: { _elements: [], _next: undefined },
_back: { _elements: [], _next: undefined }
},
_queueTotalSize: 0,
_started: false,
_closeRequested: false,
_pullAgain: false,
_pulling: false,
_strategySizeAlgorithm: [Function],
_strategyHWM: 1,
_pullAlgorithm: [Function],
_cancelAlgorithm: [Function]
}
}
我做了一些研究,发现我需要在这个 ReadableStream 上运行某种转换方法。问题是其中大部分包含无法在 Edge 上运行的 Buffer 模块,因此无法在 middleware.ts 中工作。是否有我可以使用的 polyfill?
"next": "^13.0.7"
Node v16.17.0
【问题讨论】:
标签: javascript next.js zod nextjs13