存在Mongodb适配器的NodeJS错误:由应用程序closures的连接

我在MongoDB上遇到一个奇怪的问题。 我的数据库集合正在closures,我想它是应该做的(我从mongo样板一直遵循),但我没有看到为什么文档将是空值的原因。 我已经检查了我能想到的所有方法,但我不太了解游标对象。

Console.logging它似乎给了我一堆本地mongo属性(它看起来像函数,即每个,toArray等),所以它似乎是正确的,但它不是一个数据字段,我可以看到的常规对象。

如果用if(docs == null)阻塞,连接会被closures,并且不会执行else if中的每个块。

理想情况下,如果有一种方法可以帮助解决问题,或者弄清楚如何使这个执行很好。

更多的背景:在mongo shell中,我可以请求使用天气/ /没有问题,并获得数据对象的结果3000空loggingfind();

var MongoClient = require('mongodb').MongoClient; MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { if(err){ console.log("line 7" + err); } var query = {}; var projection = { 'State' : 1, 'Temperature' : 1 }; var cursor = db.collection('data').find(query, projection); console.log("cursor" + cursor); // [object Object] var state = ''; var operator = {'$set' : {'month_high' : true } }; cursor.each(function(err, doc) { if (err) throw err; if (doc == null) { console.log("docs have value:" + doc); //NULL VALUE so will close on line 23 return db.close(); } else if (doc.State !== state) { // first record for each state is the high temp one state = doc.State; db.collection('data').update( {'_id':doc._id}, operator, function(err, updated) { if (err) console.log(err); // return db.close(); ? }); } }); }); { [MongoError: Connection Closed By Application] name: 'MongoError' } //doh { [MongoError: Connection Closed By Application] name: 'MongoError' } //doh { [MongoError: Connection Closed By Application] name: 'MongoError' } //doh 

搞清楚什么时候调用db.close()会有点混乱。 这里用find().toArray()加上一些逻辑来重写,当你更新最后匹配的文档时。 这对我有用。

 var MongoClient = require('mongodb').MongoClient; var assert = require('assert'); var Q = require('q'); MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { assert.equal(null, err); var query = {}; var projection = { 'State' : 1, 'Temperature' : 1 }; var state = ''; var operator = {'$set' : {'month_high' : true } }; var promises = []; db.collection('data').find(query, projection).toArray(function(err, docs) { assert.equal(null, err); docs.forEach(function(doc, index, arr) { var deferred = Q.defer(); promises.push(deferred.promise); if (null !== doc && state !== doc.State) { db.collection('data').update( {'_id':doc._id}, operator, function(err, updated) { assert.equal(null, err); console.log("Updated "+updated+" documents."); deferred.resolve(); }); } else { deferred.resolve(); } }); Q.all(promises).done(function() { console.log("closing"); db.close() }); }); }); 

编辑:添加Q,因为db.close()在某些情况下仍被过早调用。