Javascript Express.js+;正文分析器:POST请求中的req.body为空
我正在使用和中间件来处理传入的请求。在前端,我有一个表单,它只是一个隐藏的输入和一个提交按钮(用帕格书写): 在后端,我有使用主体解析器的Express应用程序:Javascript Express.js+;正文分析器:POST请求中的req.body为空,javascript,node.js,express,body-parser,Javascript,Node.js,Express,Body Parser,我正在使用和中间件来处理传入的请求。在前端,我有一个表单,它只是一个隐藏的输入和一个提交按钮(用帕格书写): 在后端,我有使用主体解析器的Express应用程序: const bodyParser = require('body-parser'); // ... app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); 以及处理传入请求的路由: router.post('/lessons/:l
const bodyParser = require('body-parser');
// ...
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
以及处理传入请求的路由:
router.post('/lessons/:lessonID/notes', lessonController.updateNotes);
// ... and in lessonController:
exports.updateNotes = async (req, res) => {
console.log('updateNotes request received');
console.log(req.body);
res.status(200).json({ status: 'success' });
}
当我尝试在updateNotes
中使用req.body
时,body是一个空对象,但至少应该具有值为“test”
的属性hiddenotes
。如果您有任何问题或认为您看到了问题,请发表评论
[更新]
这是一个愚蠢的错误,我忘了在提交此表单时我已经编写了一个单独的事件处理程序-在我完成所有代码之前,我只是发布了一个事件处理程序:)事件处理程序使用如下所示:
const SaveNotesButton = $('form.saveNotes');
SaveNotesButton.on('submit', ajaxSaveNotes);
function ajaxSaveNotes(e) {
e.preventDefault();
axios
.post(this.action)
.then(res => {
console.log(res.data);
})
.catch(console.error);
}
不幸的是,在使用axios制作post
s时,您需要将数据包含在这样的对象中,否则它将不会包含在请求中:
const SaveNotesButton = $('form.saveNotes');
SaveNotesButton.on('submit', ajaxSaveNotes);
function ajaxSaveNotes(e) {
e.preventDefault();
axios
.post(this.action, { notes: this.children.hiddenNotes.value }) // Data added here
.then(res => {
console.log(res.data);
})
.catch(console.error);
}
必须尝试使用邮递员或类似工具查询您的终点吗?必须尝试使用邮递员或类似工具查询您的终点吗?可能有一种解释解释解释为什么您的
req.body
未定义。你确定你的app.use(bodyParser.json())
和app.use(bodyParser.url…
是在你的app.use(“***”,路由器)之前编写的吗
行?如果您将body parser中间件放在路由器中间件之后,它基本上不会被调用,因为中间件是按应用程序中放置的顺序调用的。请使用。因此您应该将body parser
放在所有路由器逻辑之前。body parser中间件然后调用所有其他中间件(填充了req.body
之后),包括所有路由器级中间件
希望有帮助!可能有一种解释解释为什么您的req.body
未定义。您确定您的app.use(bodyParser.json())
和app.use(bodyParser.url…
是在app.use('***',router)之前编写的吗
行?如果您将body parser中间件放在路由器中间件之后,它基本上不会被调用,因为中间件是按应用程序中放置的顺序调用的。请使用。因此您应该将body parser
放在所有路由器逻辑之前。body parser中间件然后调用所有其他中间件(填充了req.body
之后),包括所有路由器级中间件
希望有帮助!不确定您是如何定义路线的,但我希望post路线如下所示:
const express = require('express');
const app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.post('/lessons/:lessonID/notes', (req, res) => {
// now pass the req object to your function
lessonController.updateNotes(req);
});
您需要将req对象传递给函数才能访问req.body…不确定如何定义路由,但我希望post路由如下所示:
const express = require('express');
const app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.post('/lessons/:lessonID/notes', (req, res) => {
// now pass the req object to your function
lessonController.updateNotes(req);
});
你需要将req对象传递给你的函数才能访问req.body…是的,我尝试在Postman中重新创建请求,但是body仍然没有显示任何数据。是的,我尝试在Postman中重新创建请求,但是body仍然没有显示任何数据。express应用程序的路由只是被分解成一个单独的文件(与app.post
)不同的是,lessonController.updateNotes函数接收req和res对象,与我在本文中包含的代码无关。请看一看我对OP的更新!很高兴您对其进行了排序!express应用程序的路径刚刚被分解成一个单独的文件(而不是与app.post
在同一行),lessonController.updateNotes函数接收req和res对象,与我在本文中包含的代码无关。请看一下我对OP的更新!很高兴您对其进行了排序!嗨,Mustansir!是的,我是应用程序。在应用程序中包含路由之前,使用-ing bodyParser几行。您是否尝试过将内容类型更改为applIcing/json?我没有尝试更改enctype-,与我在本文中包含的代码无关。马上看一眼我对OP的更新!哦。那样的话太好了!嗨,Mustansir!是的,我是应用程序。在应用程序中包含路由之前,使用-ing bodyParser几行代码。你是否尝试过将内容类型更改为application/json?我没有尝试更改enctype-,与我在本文中包含的代码无关。马上看一下我对OP的更新!哦,那样的话太好了!您是否尝试过将bodyParser.urlencoded
更改为在bodyParser.json
之前调用。不确定这是否有什么区别,但我编写了自己的中间件来捕获原始主体请求,这样我就不会丢失任何东西,我发现在bodyPaser.json
之后,req.on('end')
事件已经触发,阻止我记录数据。将我的中间件放在前面(以及一些其他更改)允许我解决这个问题。您是否尝试过将bodyParser.urlencoded
更改为在bodyParser.json
之前调用。不确定这是否有任何区别,但我编写了自己的中间件来捕获原始的body请求,这样我就不会丢失任何东西,我发现在bodyPaser.json
之后,req.on('end')
事件已经触发,阻止我记录数据。将中间件放在前面(以及其他一些更改)可以解决问题。