gpt4 book ai didi

javascript - 使用 MongoDB 连接池的 NodeJS 一次性脚本 - 如何终止?

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:45 26 4
gpt4 key购买 nike

我知道 NodeJS 中单例数据库连接类型的 MongoDB 连接池的最佳实践如下

var db = null;

var connection = function getDBConnection(callback) {
if(db) { callback(null, db) } else { MongoClient.connect( .... ) }
}

module.exports = getDBConnection;

但是,目前我无法理解的是如何在一次性脚本中处理这个问题,例如,对某个数据库集合的文档进行一些预初始化:

getDBConnection(function (err, database) {
var collection = database.collection("objects");

var allObjectsArray = collection.find( /* ... */
).toArray(function (err, objects) {

if(err != null) console.log(err);
assert.equal(null, err);

_.each(objects, function (item) {

collection.update(
{ id: item.id},
{ $set: { /* ... */ }},

function (err, result) {
if(err != null) console.log(err);
assert.equal(null, err);
}
);

});

// database.close(); <-- this fails with "MongoError: Connection Closed By Application", thrown by the update callback

});
// database.close(); <-- this fails too, thrown by the toArray callback
});

如果我这样调用脚本,它永远不会终止,因为连接仍然打开。如果我关闭底部的连接,它就会失败,因为连接已关闭。

考虑到为每次更新打开一个新连接并不是一个真正的选择,我错过了什么?保持连接打开对于 Web 应用程序来说可能没问题,但对于从 shell 脚本调用的一次性脚本来说,这确实行不通,不是吗?

抱歉,如果这个问题以前出现过,我已经进行了一些研究,但还没有完全能够为我找到一个可行的答案......

谢谢!朱利安

最佳答案

作为“池连接”,会运行代码来保持连接处于事件状态,并在驱动程序连接下需要时在池中建立更多连接。与各种“服务器代码”方法非常相似,事件循环处理程序已被调用,并且在取消注册这些处理程序之前,该进程不会在代码结束时退出。

因此,在执行所有代码后调用的两个选择是:

  1. 调用 db.close()或者在您的代码上下文中,特别是在完成所有操作后database.close()

  2. 调用 process.exit()这是 Node.js 应用程序中的通用调用,它将关闭整个进程,从而停止任何其他当前事件循环代码。如果您希望代码在某处“shell 集成”并查找退出状态,这实际上为您提供了在退出时抛出错误的选项。

或者同时调用两者。 db.close() 将允许执行到下一行代码,并且您放置在那里的任何内容也将运行。

但是您必须等到所有内容都被调用,因此您不能使用中间有异步代码的同步循环:

async.each(objects,function(item,callback) {
collection.update(
{ "_id": item._id },
{
// updates
},
callback
);
},function(err) {
if (err) throw err;
database.close();
});

关于javascript - 使用 MongoDB 连接池的 NodeJS 一次性脚本 - 如何终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27858743/

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