我有一个发布请求,打算在检索当前值后更新一个字段。
我正在尝试更新mongodb中的字段。该字段是布尔数据类型。
router.route('/books/update/:id').post((req, res) => {
Book.find({ id: parseInt(req.params.id) }, (err, books) => {
if (!books)
return next(new Error("Could not load book!"))
else {
console.log(books);
console.log(req.body);
// let book = new Book(req.body);
// console.log('Before ', book.title);
// book.completed = !book.completed
// console.log('After ', book.completed);
// book.save().then(book => {
// res.json("Update done.");
// }).catch(err => {
// res.status(400).send('Update failed');
// })
}
});
});
我正在使用邮递员,我在体内传递的数据是
{
"id" : 1,
"title" : "Read Romeo And Juliet",
"completed" : false
}
我console.log (books)
时可以查看json结果集。请求req.body
为空。为什么会这样呢?正如您在注释的代码中看到的那样,我试图设置完成的字段并将其更新回集合。最好的方法是什么。谢谢。
答案 0 :(得分:2)
可能有两个原因。首先,如果它是一个快速应用程序,请确保您具有一些正文解析中间件,以将http请求的正文解析为有效的js对象(如果愿意,可以使用JSON)。例如,当今最受欢迎的是this one。如果已安装并正确配置了它,请确保您的请求在Postman请求标头部分中将“ Content-Type”标头设置为“ application / json”。祝你好运!
// create application/json parser
var jsonParser = bodyParser.json()
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })
答案 1 :(得分:0)
我在Book模型上使用了updateOne函数,
router.route('/books/update/:id').post((req, res) => {
bookId = parseInt(req.params.id);
Book.findOne({ id: bookId }, (err, book) => {
if (!book)
return next(new Error("Could not load book!"))
else {
let book = new Book(req.body);
book.completed = !book.completed
Book.updateOne({ id: bookId }, { "completed": book.completed }, function (err, raw) {
if (err) {
res.send(err);
}
else {
res.json("Update done.");
}
});
}
});
});