什么时候使用cursor.forEach()时调用db.close()?

如果使用.toArray() ,我知道你可以在callback中使用db.close() ,像这样:

 db.collection('grades').find(query).toArray(function(err, docs) { if (err) throw err; console.dir(docs); db.close(); }); 

但是如果你需要迭代数组呢? 这似乎过分1)遍历游标来构造数组,然后2)遍历数组来做你的工作。 所以我在想,使用cursor.forEach()会很好。

 var MongoClient = require('mongodb').MongoClient; MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { if (err) throw err; var cursor = db .collection('data') .find({}) .sort({State: 1, Temperature: -1}); var prevState = ''; var curr; cursor.forEach(function(doc) { if (doc.State === prevState) return; db.collection('data').update(doc, { $set: { month_high: true}}); prevState = doc.State; }); db.close(); }); 

但是,这给我一个错误:

 ~/code/m101js $ node test.js /Users/azerner/code/node_modules/mongodb/lib/utils.js:97 process.nextTick(function() { throw err; }); ^ TypeError: undefined is not a function at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:527:15 at handleCallback (/Users/azerner/code/node_modules/mongodb/lib/utils.js:95:12) at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:493:22 at handleCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:234:5) at /Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:533:22 at queryCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:167:20) at Callbacks.flush (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:86:7) at Server.destroy (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:694:41) at Server.close (/Users/azerner/code/node_modules/mongodb/lib/server.js:344:17) at Db.close (/Users/azerner/code/node_modules/mongodb/lib/db.js:273:19) ~/code/m101js $ node test.js /Users/azerner/code/node_modules/mongodb/lib/utils.js:97 process.nextTick(function() { throw err; }); ^ TypeError: undefined is not a function at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:527:15 at handleCallback (/Users/azerner/code/node_modules/mongodb/lib/utils.js:95:12) at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:493:22 at handleCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:234:5) at /Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:533:22 at queryCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:167:20) at Callbacks.flush (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:86:7) at Server.destroy (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:694:41) at Server.close (/Users/azerner/code/node_modules/mongodb/lib/server.js:344:17) at Db.close (/Users/azerner/code/node_modules/mongodb/lib/db.js:273:19) ~/code/m101js $ 

它似乎是所有的库代码,我不知道如何debugging它。 但是看起来问题在于db.close()

  1. 这是吗?
  2. 如果是这样,那么我还会把db.close()放在哪里?

问题是db.close()被调用, 然后我试图与数据库进行交互。 当连接已closures时,您无法与数据库进行交互。

在连接closures之后,我的代码试图与数据库交互的原因是因为.update()是asynchronous的。

使用async.each为我工作。 async.each为您提供了一个callback,在集合中的所有内容都被迭代之后运行。 我在该callback中调用了db.close() ,这是我想要closures与数据库的连接的时候。