gpt4 book ai didi

node.js - 库存 Mongodb 适配器 : Connection Closed By Application 的 NodeJS 错误

转载 作者:可可西里 更新时间:2023-11-01 10:43:28 28 4
gpt4 key购买 nike

我在使用 MongoDB 时遇到了一个奇怪的问题。我的数据库集合正在关闭,我想这就是它应该做的(我正在遵循 mongo 样板文件)但我看不出为什么文档会是空值。我已经用我能想到的所有方法检查过了,但我不太了解光标对象。

Console.logging 它似乎给了我一堆原生的 mongo 属性(它们看起来像函数,例如 each、toArray 等)所以它看起来是正确的,但它不是我可以看到的带有数据字段的常规对象。

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

理想情况下,如果有一种方法可以帮助解决问题或弄清楚如何执行此操作,那就太好了。

更多背景:在 mongo shell 中我可以要求 使用天气//没问题并获取数据对象的结果,即 3000 strip 有空 find() 的记录;

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() 仍然被过早调用。

关于node.js - 库存 Mongodb 适配器 : Connection Closed By Application 的 NodeJS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26706775/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com