在 sveltekit 的 hooks.server 中读取请求正文

dev*_*ero 9 typescript svelte sveltekit

我想在我的 hooks.server.ts import type { Handle } from '@sveltejs/kit'; 中读取请求的正文

export const handle = (async ({ event, resolve }) => {
  console.log(event.request.body);
 
  const response = await resolve(event);
  return response;
}) satisfies Handle;
Run Code Online (Sandbox Code Playgroud)

这给了我

ReadableStream { locked: false, state: 'readable', supportsBYOB: false }
Run Code Online (Sandbox Code Playgroud)

如果我读了它

const reader = request.body.getReader();
let text;
let result;
while (!(result = await reader.read()).done) {
   text += result.value;
}
console.log(text);
console.log(request.body);
Run Code Online (Sandbox Code Playgroud)

然后记录正文,我得到:

ReadableStream { locked: true, state: 'closed', supportsBYOB: false }
Run Code Online (Sandbox Code Playgroud)

这导致我想要执行的实际调用抛出错误

TypeError:主体在 Request.json (/home/hp/git/booking/node_modules/undici) 的 specConsumeBody (/home/hp/git/booking/node_modules/undici/lib/fetch/body.js:492:11) 处不可用/lib/fetch/body.js:359:14)

如何读取钩子中的正文?

Tob*_*eck 17

TypeError: Body is unusable我在尝试使用 JSON 正文调试 POST 请求时收到错误,因为我确实等待了该请求两次。

console.log(await request.text()) // X only this is logged
console.log(await request.json()) // --> throws error
Run Code Online (Sandbox Code Playgroud)

相反,只需等待一次请求!

console.log(await request.json()) // logs, no error
Run Code Online (Sandbox Code Playgroud)


H.B*_*.B. 7

您可以clone()使用Request它而不修改原始内容。