我正在调试 Mongoose 查询的一大块,我想依次执行这些查询以避免不一致。经过大量的尝试、错误和测试,我终于偶然发现了一个似乎可行的解决方案。
在一个查询中,我包含一个查询,在另一个查询中,我跳过包含回调函数。我所指的回调可以在Model.findByIdAndUpdate
语句的语法中看到。
Model.findByIdAndUpdate(id, [更新], [选项], [***回调***])
有回调函数的可以完美执行,没有回调函数的则不会执行。它被封装在一个返回 Mongoose promise 的函数中。
这是 Robomongo 中架构的第一个查询,成功添加了“组织者”:
function addUserToHackathonOrganisers(userId, hackathonId) {
return Hackathon.findOneAndUpdate(
{hackathonId: hackathonId},
{$addToSet: {organisers: userId.toString()}},
{new: true}
);
}
现在,这是有效的查询(带有回调)。在附图中,您可以看到组织者数组[1],这表明它已更新。
function addUserToHackathonOrganisers(userId, hackathonId) {
return Hackathon.findOneAndUpdate(
{hackathonId: hackathonId},
{$addToSet: {organisers: userId.toString()}},
{new: true},
function (err) {
if (err) {
console.log(err);
}
}
);
}
我不知道为什么会发生这种情况。有什么想法吗?
最佳答案
这是因为不带回调选项的 findOneAndUpdate()
方法返回 Query
,它不会执行,但带有回调的方法会执行,因此您会看到带有回调的更新,而没有看到没有回调的更新。
来自docs:
A.findOneAndUpdate(conditions, update, options, callback) // executes
A.findOneAndUpdate(conditions, update, options) // returns Query
A.findOneAndUpdate(conditions, update, callback) // executes
A.findOneAndUpdate(conditions, update) // returns Query
A.findOneAndUpdate() // returns Query
如果您将函数编写为
function addUserToHackathonOrganisers(userId, hackathonId) {
return Hackathon.findOneAndUpdate(
{hackathonId: hackathonId},
{$addToSet: {organisers: userId.toString()}},
{new: true}
).exec(); // chaining exec() to a Query returns a Promise
}
然后当你调用它时,它会执行并返回一个 promise ,例如
var promise = addUserToHackathonOrganisers(userId, hackathonId);
promise.then(function(addedUser){
console.log(addedUser); // shows the updated user
});
更新
为了在评论中解决您的 follow-up question 问题,promise 的 then()
方法中的回调
promise.then(function(addedUser){
console.log(addedUser); // shows the updated user
});
与 findOneAndUpdate()
选项中的回调相同,只不过 Promise 不是使用两个参数,而是使用 Promise 的 catch()
方法中捕获的错误参数单独处理参数:
promise.then(function(addedUser){
console.log(addedUser); // shows the updated user
})
.catch(function(err){
console.log(err);
});
有关更多详细信息,请参阅文档 here 。
关于node.js - Mongoose 对回调的存在有不同的 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43761698/