繁体   English   中英

node.js mongodb-collection.find()。toArray(callback)返回空

[英]node.js mongodb - collection.find().toArray(callback) returns empty

mydocuments.find({})。toArray在下面的代码中返回空。 由于使用MongoClient.connect,我可以看到一些解决方案已发布但未应用。 任何帮助将不胜感激。

var MONGOHQ_URL="mongodb://harishvc:supersecretreally@something.com:12345/abcd";
 var mongodb = require('mongodb');
 MongoClient = mongodb.MongoClient;
 var async = require('async');
 ….
  async.series([
  function (callback) {
   console.log("start: db connection");
      MongoClient.connect(MONGOHQ_URL, { server: { auto_reconnect: true } }, function(err, db2) {
         if (err) {return callback(err, "connect error");}
         db = db2;
         console.log("end: db connection");
         callback(null,"end: db connection");
     });
  },
  function (callback) {
      console.log("start: getting handle to collection");
      mydocuments = db.collection('test');  
      console.log("end: getting handle to collection");
      callback(null,"end: getting handle to collection");
  },
  function (callback) {
     console.log ("start: inserting new entries ....");
     mydocuments.insert({i:1},callback);    
     console.log ("end: inserting new entries ....");
     callback(null,"end: inserting new entries");
   },
   function (callback) {
      console.log("start: listing all entries ....");  
      mydocuments.find({}).toArray(function(err, docs) {
          if (err) {return callback(err, "connect error");}
           // Does not get executed???
            console.log("Hello World!");
      });       
      console.log("end: listing all entries ....");
      callback(null,"end: listing all entries");    
  }],
      …..

产量

start: db connection
end: db connection
start: getting handle to collection
end: getting handle to collection
start: inserting new entries ....
end: inserting new entries ....
start: listing all entries ....
end: listing all entries ....

问题出在插入数据的第三个功能中。 尽管您传递了回调,但是此插入是异步的,因此它将继续执行下面两行代码:

console.log ("end: inserting new entries ....");
callback(null,"end: inserting new entries");

第3个函数中的第2个callback()调用告诉async继续并继续执行find()的第4个函数。 此时,您从第3个函数进行的插入可能尚未完成。 这就是为什么在第4个函数中查找结果为空的原因。

您的第三个函数应如下所示:

 function (callback) {
     console.log ("start: inserting new entries ....");
     mydocuments.insert({i:1},function(err) {
         if (err) {
             callback(err, "error inserting");
         } else {
             callback(null,"end: inserting new entries");
         }
         console.log ("end: inserting new entries ....");

     });    
 },

这样可以确保您在执行下一个执行find()的下一个函数(4th)之前完成对第3个函数的插入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM