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

我真的很担心承诺和asynchronousJavaScript工作。 我想在/ user上执行一个GET并查询mongo,以便第一个查询的结果以某种方式处理以形成第二个查询的查询,并且该查询的结果是第三个查询的查询。

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

这样做的正确方法是什么,以便客户端获得第二个嵌套的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客户端,它已经返回了查询的承诺,这意味着你可以返回下一个查询,然后捕获它,或者捕获一个错误。

未经testing,但类似的东西应该工作

 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); }); }); 

请注意,如果没有传递callback函数,像toArray这样的方法会自动返回一个promise。