在 Mongoose 查询中使用 javascript Promise

Posted

技术标签:

【中文标题】在 Mongoose 查询中使用 javascript Promise【英文标题】:Using javascript promises with Mongoose queries 【发布时间】:2018-09-09 15:18:12 【问题描述】:

通常,如果我要运行多个 mongoose 查询,我会使用内置的 Promise 将它们链接在一起。在这种情况下,用户选择要搜索的模式。这可能是其中之一或两者兼而有之。以下示例使用发布数据来定义要搜索的模式,如果其中一个为 false,则应继续通过承诺链。现在在查询之前调用最终的承诺。

我的快速控制器中的示例:

app.post('/custom-search', function (req, res) 
     var single = false
     var multi = false


      if(req.body.single)
          var single = true
      

      if(req.body.multi)
          var multi = true
      

    var promise = new Promise(function (resolve, reject) 
        if(multi)
            multiSchema.find(, function (err, result) 
                if(!err)
                    console.log(result);
                    resolve()
                
            )
        else
            resolve()
        
    ).then(function (value) 
        if(single)
            singleSchema.find(, function (err, result) 
                if(!err)
                    console.log(result);
                    resolve()
                
            )
        else
            resolve()
        
    ).then(function (value) 
        console.log("done");
    )
)

);

输出:

>done
>[singleResults]
>[multiResults]

done 应该最后打印,这是第一个问题。

【问题讨论】:

你为什么不包括解决?在你的承诺定义中?新的承诺(功能(拒绝) @Hadouken Opps 我正在测试一些东西,并认为我已经回到了我的原始代码。我加进去了。 我注意到你的代码的几件事。你为什么不回承诺?其次,在您的第一个 .then() 中,您使用的是无法访问的 resolve()。 我猜你必须在你的第一个 .then() 回调中定义另一个承诺 【参考方案1】:

正如我们所讨论的,几乎没有什么需要清理的。首先,通过实际使用并返回 Promise 以使其正常工作,其次,在您的第一个 .then() 中创建一个 mini-promise 来解决和拒绝您的单个条件语句。第三,处理/捕捉承诺。

我写了你的代码的伪版本来说明我的观点,希望它可能有用。

app.get('/custom-search', function (req, res) 
        // Manipulating values to test responses
        var single = false;
        var multi = true;

        var promise = new Promise(function (resolve, reject) 
            if (multi) 
                setTimeout(function () 
                    resolve('MULTI RESOLVED!');
                , 3000);
             else 
                reject('MULTI REJECTED!');
            
        )
            .then(function (value) 
                new Promise(function (resolve, reject) 
                    if (single) 
                        setTimeout(function () 
                            resolve('SINGLE RESOLVED!');
                        , 3000);
                     else 
                        reject('SINGLE REJECTED!');
                    
                )
                    .catch(function (error) 
                        console.log('SINGLE ERROR!', error);
                    )
                    .then(function (value) 
                        console.log('SINGLE DONE', value);
                    );
            )
            .catch(function (error) 
                console.log('MULTI ERROR!', error);
            );
        return promise;
    );

【讨论】:

以上是关于在 Mongoose 查询中使用 javascript Promise的主要内容,如果未能解决你的问题,请参考以下文章

嵌套的 Mongoose 查询数据未显示在 GraphQL 查询中

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

在 express (async/await) 中使用一个 mongoose 查询的输出作为另一个查询的输入

Mongoose中关联查询populate的使用

在 Mongoose 中使用连接和过滤器进行查询