[英]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;
但是,目前我無法確定的是如何在一個一次性腳本中處理此問題,該腳本對某些db集合的文檔進行了一些預初始化:
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應用程序中的通用調用,它將關閉整個過程,並因此停止任何其他當前事件循環代碼。 實際上,如果您希望將代碼“ shell集成”到某處並尋找退出狀態,這實際上為您提供了一個在退出時引發錯誤的選項。
或同時致電。 db.close()
將允許執行下一行代碼,並且您放置在其中的任何內容也將運行。
但是您必須等到一切都被調用后,才能在中間使用異步代碼的情況下使用同步循環:
async.each(objects,function(item,callback) {
collection.update(
{ "_id": item._id },
{
// updates
},
callback
);
},function(err) {
if (err) throw err;
database.close();
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.