gpt4 book ai didi

Node.js + MongoDB更新操作确认

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

在 Node.js 中,我有(简要地)这个脚本:

var http = require('http');
var XmlStream = require('xml-stream');
var mongo = require('mongodb');

var tims = { ... };

var db = new mongo.Db('tims', new mongo.Server("127.0.0.1", 27017, {}), {w: 1});
db.open(function(e, db) {
var req = http.get({
host: tims.uri,
path: '/xml/'+tims.database+tims.services.database
}).on('response', function(res) {
res.setEncoding('utf8');
cProjects = db.collection("projects");
var xml = new XmlStream(res);

xml.on('updateElement: Tims ProjectID', function(project) {
// console.log(project.$text+' - '+project.$.title);
cProjects.update({project_id: project.$text}, {project_id: project.$text, title: project.$.title}, {upsert:true}, function(err, result) {
console.log('result: '+result);
});
});

xml.on('end', function(data) {
db.close();
});

});
});

我正在使用一个名为 xml-stream 的 Node.js 包将来自 Node 的响应 block 拼凑在一起,以便在处理之前获得有效的 XML。我的问题:如果我遗漏了

xml.on('end', function(data) {
db.close();
});

我的连接永远不会关闭,控制台只是挂起。好处是 console.log('result: '+result); 写入控制台,我可以看到我的数据已成功提交。因此,如果我留在 end 事件中并在处理完所有 XML 后关闭数据库,Node 实例将在 console.log('result: '+result) 之前终止写的。

我是 MongoDB 和 Node.js 的新手,所以我很好奇这里有什么最佳实践来确认,或者简单地指出我做错了什么。

感谢您的帮助。

最佳答案

看起来 'end' 事件发生在所有 update 回调完成之前。因此,您需要稍微修改代码以跟踪仍未决的更新数量,并且仅在 'end' 事件触发后才调用 db.close()并且所有待处理的更新都已完成。

所以像这样:

db.open(function(e, db) {
var req = http.get({
host: tims.uri,
path: '/xml/'+tims.database+tims.services.database
}).on('response', function(res) {
res.setEncoding('utf8');
cProjects = db.collection("projects");
var xml = new XmlStream(res);
var end = false;
var pending = 0;

xml.on('updateElement: Tims ProjectID', function(project) {
// console.log(project.$text+' - '+project.$.title);
++pending;
cProjects.update({project_id: project.$text}, {project_id: project.$text, title: project.$.title}, {upsert:true}, function(err, result) {
console.log('result: '+result);
if (--pending === 0 && end) {
db.close();
}
});
});

xml.on('end', function(data) {
end = true;
});

});
});

关于Node.js + MongoDB更新操作确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13939695/

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