Node.js 如何获取MongoDB collection.find()上的回调

Node.js 如何获取MongoDB collection.find()上的回调,node.js,mongodb,express,Node.js,Mongodb,Express,在MongoDB/Node/Express中运行collection.find()时,我希望在完成后得到一个回调。这个的正确语法是什么 function (id,callback) { var o_id = new BSON.ObjectID(id); db.open(function(err,db){ db.collection('users',function(err,collection){ collection.find({'_id':o

在MongoDB/Node/Express中运行
collection.find()
时,我希望在完成后得到一个回调。这个的正确语法是什么

 function (id,callback) {

    var o_id = new BSON.ObjectID(id);

    db.open(function(err,db){
      db.collection('users',function(err,collection){
        collection.find({'_id':o_id},function(err,results){  //What's the correct callback synatax here?
          db.close();
          callback(results);
        }) //find
      }) //collection
    }); //open
  }

这是正确的回调语法,但是
find
为回调提供的是一个数组,而不是一个文档数组。因此,如果希望回调以文档数组的形式提供结果,请调用光标以返回结果:

collection.find({'_id':o_id}, function(err, cursor){
    cursor.toArray(callback);
    db.close();
});
请注意,函数的回调仍然需要提供
err
参数,以便调用者知道查询是否有效

2.x驱动程序更新

find
现在返回光标,而不是通过回调提供光标,因此典型用法可以简化为:

collection.find({'_id': o_id}).toArray(function(err, results) {...});
或者在这种情况下,如果只需要一个文档,则使用起来更简单:


基于JohnnyHK answer,我简单地将我的调用包装在db.open()方法中,它成功了。谢谢@johnyhk

app.get('/answers', function (req, res){
     db.open(function(err,db){ // <------everything wrapped inside this function
         db.collection('answer', function(err, collection) {
             collection.find().toArray(function(err, items) {
                 console.log(items);
                 res.send(items);
             });
         });
     });
});
app.get('/answers',函数(req,res){

open(function(err,db){//所以在这种情况下,我只返回一个结果,引用
数据[0]是正常的
在控制器中?在这种情况下,您应该使用
findOne
来代替它,它直接将文档提供给回调。请参阅,他们称之为…回调地狱!它开始了…我使用相同的方法,但我得到了db.open不是函数错误,您能帮助我吗
app.get('/answers', function (req, res){
     db.open(function(err,db){ // <------everything wrapped inside this function
         db.collection('answer', function(err, collection) {
             collection.find().toArray(function(err, items) {
                 console.log(items);
                 res.send(items);
             });
         });
     });
});