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

标签 node.js mongodb mongoose callback

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

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

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

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

这是 Robomongo 中架构的第一个查询,成功添加了“组织者”:

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

注意organisers Array[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/

相关文章:

javascript - 如何在快速路由的控制台中记录 500 个状态错误?

javascript - Meter 将新对象推送到集合中的数组

javascript - 为什么 mongoose 在创建和更新文档时异步运行?

node.js - 如何根据 mongodb (mongoose) 中填充的对象对元素进行排序

node.js - nodemon - 应用程序崩溃 - 启动前等待文件更改

javascript - 在前端和后端加载相同的文件

Node.js 和 Couchbase 兼容性

javascript - 错误 : Can't set headers after they are sent - Node. js

mongodb - mongodb 中日期的分钟差异

MongoDB 3.0.1 复制设置