追踪起来确实很痛苦,但在自己研究了一段时间后,我发现 PUT 和 PATCH 请求也会出现同样的问题。这表明它与请求的正文有关。令人烦恼的是,在发现这一点后,我偶然发现了这条线问题#7960 https://github.com/vercel/next.js/issues/7960,他们发现了同样的问题。
简单地说,请求的正文被处理一次https.onRequest()
进而nextjsHandle()
尝试再次解析它。因为尸体已经被处理过了raw-body
模块(内nextjsHandle()
) 无限期地等待'data'
永远不会发生的事件。
目前,没有办法关闭由https.onRequest()
,因此必须在 next.js 端禁用它。不幸的是,没有可以添加的用于正文解析的全局关闭开关next.config.js
并且必须对每个 API 路由(中的文件)执行此操作pages/api
)(如果建议的修复方案可能会改变公关#16169 https://github.com/vercel/next.js/pull/16169被添加)。
要禁用给定路由的正文解析,请将以下内容添加到路由的文件中
export const config = {
api: {
// disables call to body parsing module
bodyParser: false,
}
};
然而,正如中提到的问题#7960 https://github.com/vercel/next.js/issues/7960 by @rscotten https://github.com/rscotten,您可能还想使用next dev
在开发您的应用程序时,因此您需要在使用时启用它next dev
但在部署时禁用它。这可以使用以下方法完成
export const config = {
api: {
// disables call to body parsing module while deployed
bodyParser: process.env.NODE_ENV !== 'production',
}
};
将这些更改应用到hello.js
gives:
export default async (req, res) => {
const {
body,
method
} = req;
console.log("method :>> ", method);
console.log("body :>> ", body);
switch (method) {
case "POST":
res.status(200).end(`Method ${method} supported!`);
break;
default:
res.setHeader("Allow", ["POST"]);
res.status(405).end(`Method ${method} Not Allowed`);
}
};
export const config = {
api: {
// disable nextjs's body parser while deployed
// (as body parsing is handled by `https.onRequest()`),
// but enable it for local development using `next dev`
bodyParser: process.env.NODE_ENV !== 'production',
}
};