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

标签 javascript node.js mongodb control-flow

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 ....

最佳答案

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

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

第三个函数中的第二个 callback() 调用告诉异步继续并继续执行 find() 的第四个函数。此时,您从第三个函数插入可能尚未完成。这就是为什么在第 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() 的下一个函数(第 4 个)之前完成在第 3 个函数中的插入。

关于javascript - node.js mongodb - collection.find().toArray(callback) 返回空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20157366/

相关文章:

javascript - 使用 'agenda' 时,Nodemon 在启动时崩溃且无踪迹

node.js - 从另一个 Nodejs 应用程序调用一个 Nodejs 应用程序中的 API 的方法

mongodb - 如何在 MongoDB 中使用 $match

mongodb - 意外关闭 mongos 版本 v4.2.0

python - Flask:设置应用程序和请求特定的属性?

javascript - 使用 jQuery 检测移动设备旋转

javascript - ajax 调用的纬度和经度 - Html5

javascript - jQuery FileUpload 发送的文件数据在哪里?

node.js - 找不到模块 '../build/Release/node_expat.node'

javascript - Node.js/Express 应用程序中的内存消耗