NodeJS错误与库存Mongodb适配器:连接由应用程序关闭

时间:2014-11-03 02:05:03

标签: node.js mongodb

我对MongoDB有一个奇怪的问题。我的数据库集合正在关闭,我认为这应该是它应该做的(我从mongo样板文件中跟随)但是我没有看到为什么文档将为null值。我已经按照我能想到的每一种方式检查了这个,但我不太了解光标对象。

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

在遇到if if(docs == null)的if块之后,连接被关闭,并且它将不执行else中的每个块。

理想情况下,如果有一种方法可以帮助排除故障或弄清楚如何执行此操作会很棒。

更多背景: 在我可以要求的mongo shell中   使用天气//没问题 并使用空的find();

获取数据对象的结果,即3000条记录
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

1 个答案:

答案 0 :(得分:1)

确定何时调用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()。