使用 MongoDB 连接池的 NodeJS 一次性脚本 - 如何终止
NodeJS one-shot script using MongoDB connection pooling - how to terminate?
我知道单例数据库连接类型的 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 脚本调用的一次性脚本,这真的行不通,不是吗?
对不起,如果这个问题以前出现过,我已经进行了一些研究,但还没有完全为我提出一个可行的答案......
谢谢!朱利安
作为"池连接",正在运行代码以保持连接处于活动状态,并在驱动程序连接下需要时在池中建立更多连接。与各种"服务器代码"方法非常相似,事件循环处理程序已被调用,并且在取消注册这些处理程序之前,进程不会在代码结束时退出。
因此,在执行所有代码后调用的两个选项是:
-
在完成所有操作后,专门调用
db.close()
或代码上下文中database.close()
调用。 -
调用
process.exit()
这是node.js应用程序中的通用调用,它将关闭整个过程,从而停止任何其他当前事件循环代码。这实际上为您提供了一个选项,如果您希望您的代码在某处"外壳集成"并查找退出状态,则可以在退出时抛出错误。
或者同时打电话给两者。 db.close()
将允许执行到下一行代码,并且您放在那里的任何内容也将运行。
但是你必须等到所有内容都被调用,所以你不能在中间使用带有异步代码的同步循环:
async.each(objects,function(item,callback) {
collection.update(
{ "_id": item._id },
{
// updates
},
callback
);
},function(err) {
if (err) throw err;
database.close();
});
相关文章:
- 当使用Watchify时,Browserify+Babelify Gulp任务没有终止
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 删除对象时终止setInterval
- 使用react native检测应用程序终止
- 网络工作者突然终止工作
- 未终止的字符串常量JavaScript
- 当传递innerHTML和(this.id)时,循环不会终止
- 函数输入上未终止的文本字符串
- 未处理的 JavaScript 异常终止 MSAppHost/WWAHost.exe
- 如何终止捕获
- 终止所有正在进行的XHR请求
- 如何在fancybox终止加载后调用javascript函数
- JavaScript 中数据库数据的未终止字符串文字
- Postgresql错误:连接已终止
- "未终止的模板文字“;当文字包含脚本标记时出现语法错误
- JavaScript For Loop - 执行终止条件
- 浏览器关闭时终止会话
- 如何在等待php客户端脚本的回复时终止php服务器脚本
- SCRIPT1015:加载字符串时未终止的字符串常量
- 终止无响应/无限循环的WebWorker(Javascript)