2015-06-05 74 views
2

如果使用.toArray(),我知道你可以使用db.close()回调里面,像这样:什么时候使用cursor.forEach()调用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()
+0

你为什么要关闭它? – adeneo

+0

@adeneo我不确定。我实际上正在参加[班级](https://university.mongodb.com/courses/10gen/M101JS/2015_May/syllabus),我不太确定自己在做什么。但除非关闭它是你在这种情况下永远不想做的事情,我的问题依然存在。 –

+0

一般而言,我认为大多数应用程序只会连接一次,并保持连接打开,实际上并不需要关闭每次调用DB的连接。 – adeneo

回答

2

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

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

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