如何使用 expressjs 和 mongodb 使用 promises/callbacks?

How to use promises/callbacks using expressjs and mongodb?

我真的很困惑 promises 和异步 javascript 是如何工作的。我想在 /user 上执行 GET 并查询 mongo 以便以某种方式处理第一个查询的结果以形成第二个查询的查询,并且该查询的结果是第三个查询的查询询问。

基本上我希望最终的mongo结果通过res.send(result)发送回客户端。

执行此操作的正确方法是什么,以便客户端通过第三个嵌套 mongo 查询的结果返回 200 OK?

app.get('/user', function (req, res, next) {

    var query = {"isRegistered": false }

    db.collection('users', function (err, collection) {
        collection.find(query).toArray(function (err, result) {
            if (err) {
                console.log(err)
            }
            else {
                if (result.length > 0) {
                     // do some random processing 
                     var randomUser = result[Math.floor(Math.random() * result.length)] 
                    // do ANOTHER db query
                    query = {"age": randomUser.age}
                    collection.find(query).toArray(function (err,result) {
                         if (err) {
                            console.log(err)
                         }
                         else {
                           // do some other logic ...
                           query = {something}
                           collection.find(query).toArray(function (err,result) {
                               if (err) {
                                 console.log(err);
                               }
                               else {
                                  // FINALLY RETURN THIS RESULT
                                  res.send(result);
                                  next()
                               }
                           })
                         }
                    })
                }
            }
        });
    });

假设您正在使用 Node 的常规 Mongo 客户端,它已经 return 承诺查询,这意味着您可以 return 下一个查询并在then,或者在最后用 catch.

捕获错误

未经测试,但类似的东西应该可以工作

app.get('/user', function (req, res, next) {

    var query = {"isRegistered" : false };
    var collection = db.collection('users');

    collection.find(query).toArray().then( result => {
        var randomUser = result[Math.floor(Math.random() * result.length)];
        var query2     = {"age" : randomUser.age};

        return collection.find(query2).toArray();
    }).then( result => {
        var query3 = {something : 'something'};

        return collection.find(query3).toArray();
    }).then( result => {
        res.status(200);
        res.send(result);
    }).catch( err => {
        console.log(err);
        res.status(500);
    });
});

请注意,如果未传递回调函数,toArray 等方法会自动 return 承诺。