Javascript Express.js+;正文分析器:POST请求中的req.body为空

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

我正在使用和中间件来处理传入的请求。在前端,我有一个表单,它只是一个隐藏的输入和一个提交按钮(用帕格书写):

在后端,我有使用主体解析器的Express应用程序:

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')
事件已经触发,阻止我记录数据。将中间件放在前面(以及其他一些更改)可以解决问题。