【问题标题】:When do you call db.close() when using cursor.forEach()?使用 cursor.forEach() 时何时调用 db.close()?
【发布时间】:2015-08-20 22:34:20
【问题描述】:

如果使用.toArray(),我知道你可以像这样在回调中使用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 $

似乎都是库代码,我不确定如何调试它。但看起来问题出在db.close()

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

【问题讨论】:

  • 为什么要关闭它?
  • @adeneo 我不确定。我实际上正在接受class 并且不太确定我在做什么。但除非关闭它是您在这种情况下永远不想做的事情,否则我的问题仍然存在。
  • 一般来说,我认为大多数应用程序只会连接一次,并保持连接打开,真的不需要每次调用数据库都关闭连接
  • 我猜forEach 调用是异步的,update 肯定是异步的,所以你可能正在关闭连接,而你仍在使用它。
  • 请看这个 SO 答案:stackoverflow.com/questions/25507866/…。我认为它应该有所帮助。

标签: javascript node.js mongodb cursor


【解决方案1】:

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

我的代码在连接关闭后尝试与数据库交互的原因是因为.update()是异步的。

使用async.each 为我工作。 async.each 在集合中的所有内容都被迭代后给你一个回调来运行。我在那个回调中调用了db.close(),此时我想关闭与数据库的连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 2021-02-14
    • 2014-10-19
    • 1970-01-01
    • 2013-08-29
    • 2014-08-18
    • 2016-02-11
    相关资源
    最近更新 更多