javascript - Mongoose .save() 未执行
问题描述
我有这段代码不起作用。我正在尝试在使用ObjectId
(通过将其添加到数组)修改后保存用户文档。但是,user.save()
永远不会执行(我知道这一点是因为数据库中的文档没有改变),回调/承诺也没有。然而Voot
,正在被保存。
我尝试过调整回调和承诺,但没有成功。有谁知道该怎么做?
这是代码:
(为避免混淆,请注意handleError()
andsendJson()
函数是我制作的自定义函数)
// Create new voot
var newVoot = Voot({
title,
body,
user: userId,
is_public,
create_date
});
newVoot.save().then((voot) => {
User.findById(userId, (err, user) => {
handleError(err, 400, res);
if (user) {
user.voots.push(voot._id);
// This console log shows me the correct modified user document
console.log(user);
user.save().then(() => {
// This console.log and sendJson does not get executed
console.log("User object is saved");
sendJson(200, {voot}, res);
}).catch((err) => {
// This console log does not get executed
console.log(err);
});
}
})
});
解决方案
User.findById(userId, (err, user) => ...
在其回调函数中有两个参数:err
和user
.
user
是从 MongoDB 返回的文档,这意味着它是一个普通的 Javascript 对象,因此您不能调用.save()
它。
对于这个用例,您可以使用 Mongoose 的findbyIdAndUpdate(),它将执行您对User
模型所需的两项操作。只需记住将{ upsert: true }
其作为选项对象提供,以确保您创建一个新文档(如果它尚不存在)。
例子
User.findByIdAndUpdate({ id }, { update1: 'value' }, { upsert: true }, (err, result) => {
// handle result
})
推荐阅读
- java - 在 lambda 表达式 java 中返回另一个匿名函数
- maven - 如何找出 Wildfly 1x.xx 中使用的 RESTEasy 版本
- javascript - 如何从文本框中获取文本并进行比较?
- azure-cosmosdb - Cosmos Db 是否支持多面体?
- java - 如何使用 JavaFX 对图像进行像素化?
- xcode - 如何在 UITests 中禁用 SwiftUI 动画?
- javascript - 如何在浏览器中播放 .m4a 文件?(反应/HTML5)
- java - 如何在 Sentry 报告中添加标签?
- excel - 如何在每列之间添加多列?
- ionic4 - Ionic 4 - 如何以编程方式清除离子搜索栏?