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

mydocuments.find({})。toArray在我的代码下面返回空。 我可以看到发布的几个解决scheme,但由于我使用的是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 .... 

问题出在插入数据的第三个函数中。 虽然你传入callback,但是这个插入是asynchronous的,所以它继续执行下面的两行代码:

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

这个第三个函数中的第二个callback()调用告诉asynchronous继续,并继续执行find()的第四个函数。 在这一点上,你从第三个函数插入可能还没有完成。 这就是为什么在第四个函数中find的结果是空的。

你的第三个function应该是这样的:

  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)之前完成。