【发布时间】:2018-01-28 18:49:48
【问题描述】:
我正在使用Express 和body-parser 中间件来处理传入的请求。在前端,我有一个表单,它只是一个隐藏的输入和一个提交按钮(用 Pug 编写):
form(notes="saveNotesForm" action=`/lessons/${lesson._id}/notes` method="POST" enctype="application/x-www-form-urlencoded")
input(type="hidden" id="hiddenNotes" name="hiddenNotes" alt="Notes Copy" value="test").notesHidden
input(type="submit" name="saveNotes" alt="Save Notes" value="Save")
在后端,我有使用 body-parser 的 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 时,主体是一个空对象,但至少应该具有属性hiddenNotes,其值为"test"。如果您有任何问题或认为您发现了问题,请发表评论!
[更新]
这是一个愚蠢的错误,我忘记了我已经为提交此表单时编写了一个单独的事件处理程序 - 在我完成所有代码之前我只是在 SO 上发布了 :) 事件处理程序使用 axios 和看起来像这样:
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制作posts时,需要像这样将数据包含在对象中,否则请求中不会包含:
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);
}
【问题讨论】:
-
您是否尝试过将
bodyParser.urlencoded更改为在bodyParser.json之前调用。不确定它是否有任何区别,但我编写了自己的中间件来捕获原始正文请求,所以我不会丢失任何东西,我发现在bodyPaser.json之后,req.on('end')事件已经触发,阻止我记录数据.在此之前放置我的中间件(以及其他一些更改)使我能够解决问题。
标签: javascript node.js express body-parser