为什么 req.body 返回一个空的 object?
why is req.body returning an empty object?
如标题所述,req.body 打印出一个空的 object 或 {}。我查看了其他一些帖子,发现这是一个常见问题,但我发现 none 已发布的解决方案解决了该问题。
客户端代码
const myData = "hello world";
const options = {
method: "POST",
header: {
"Content-Type": "application/json",
},
body: JSON.stringify(myData),
};
fetch("http://localhost:8000/api", options);
服务器端node.js代码
app.use(express.json({ limit: "1000mb" }));
app.use(express.urlencoded({ limit: "1000mb", extended: true }));
app.listen(8000, function () {
console.log("server is running");
});
app.use(express.static("public"));
app.post("/api", (req, res) => {
console.log(req.body);
});
编辑:我相信 body-parser 已经成为 express 的一部分一段时间了,express 通过
实现了自己版本的 body 解析器
app.use(express.json({ limit: "1000mb" }));
app.use(express.urlencoded({ limit: "1000mb", extended: true }));
你有两个问题。
Headers
您的直接问题是打错了字。您需要传递给 fetch
的选项名称是 headers
(复数)而不是 header
.
由于您未能说明您正在发送 JSON,因此您完全绕过了 JSON 解析中间件。
现代JSON
当前的 JSON 规范允许 JSON 文本包含任何 JSON 数据类型。
原规范只允许顶层为object或数组。
您使用的中间件默认执行原始规范,因此尝试将字符串作为整个 JSON 文本发送将引发异常。
允许设置字符串 strict
:
app.use(express.json({ limit: "1000mb", strict: false }));
如标题所述,req.body 打印出一个空的 object 或 {}。我查看了其他一些帖子,发现这是一个常见问题,但我发现 none 已发布的解决方案解决了该问题。
客户端代码
const myData = "hello world";
const options = {
method: "POST",
header: {
"Content-Type": "application/json",
},
body: JSON.stringify(myData),
};
fetch("http://localhost:8000/api", options);
服务器端node.js代码
app.use(express.json({ limit: "1000mb" }));
app.use(express.urlencoded({ limit: "1000mb", extended: true }));
app.listen(8000, function () {
console.log("server is running");
});
app.use(express.static("public"));
app.post("/api", (req, res) => {
console.log(req.body);
});
编辑:我相信 body-parser 已经成为 express 的一部分一段时间了,express 通过
实现了自己版本的 body 解析器app.use(express.json({ limit: "1000mb" }));
app.use(express.urlencoded({ limit: "1000mb", extended: true }));
你有两个问题。
Headers
您的直接问题是打错了字。您需要传递给 fetch
的选项名称是 headers
(复数)而不是 header
.
由于您未能说明您正在发送 JSON,因此您完全绕过了 JSON 解析中间件。
现代JSON
当前的 JSON 规范允许 JSON 文本包含任何 JSON 数据类型。
原规范只允许顶层为object或数组。
您使用的中间件默认执行原始规范,因此尝试将字符串作为整个 JSON 文本发送将引发异常。
允许设置字符串 strict
:
app.use(express.json({ limit: "1000mb", strict: false }));