gpt4 book ai didi

node.js - Mongoose 对回调的存在有不同的 react

转载 作者:可可西里 更新时间:2023-11-01 10:02:35 26 4
gpt4 key购买 nike

我正在调试我想一个接一个执行以避免不一致的一大块 Mongoose 查询。经过大量的试验、错误和测试,我终于偶然发现了一个似乎有效的解决方案。

在一个查询中,我包含了一个查询,而在另一个查询中,我跳过了回调函数。我所指的 回调 可以在 Model.findByIdAndUpdate 语句的语法中看到。

Model.findByIdAndUpdate(id, [更新], [选项], [***回调***])

有回调函数的完美执行,没有回调函数的不执行。它被封装在一个返回 Mongoose promise 的函数中。

这是 Robomongo 中成功添加“组织者”的模式的第一个查询:

function addUserToHackathonOrganisers(userId, hackathonId) {
return Hackathon.findOneAndUpdate(
{hackathonId: hackathonId},
{$addToSet: {organisers: userId.toString()}},
{new: true}
);
}

注意组织者数组[0],它表示没有更新。 enter image description here

现在,这是有效的查询(带有回调)。在附图中,您可以看到组织者数组[1],这表明它已更新。

function addUserToHackathonOrganisers(userId, hackathonId) {
return Hackathon.findOneAndUpdate(
{hackathonId: hackathonId},
{$addToSet: {organisers: userId.toString()}},
{new: true},
function (err) {
if (err) {
console.log(err);
}
}
);
}

enter image description here

我不知道为什么会这样。有什么想法吗?

最佳答案

这是因为没有回调选项的 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,在 promisethen() 方法中回调

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com