2013-10-01 57 views
4

我已經開始在一個簡單的node.js應用程序中使用Q Promise包。所以我對如何在所有承諾序列完成後關閉數據庫連接感興趣。Node.js:在MongoDb中使用Promise

例子:

var toDbConnectionString = function(dbSettings) { 
    return "mongodb://" + 
     dbSettings.user + ":" + 
     dbSettings.password + "@" + 
     dbSettings.url; 
}; 

var connectionString = toDbConnectionString(dbSettings); 

Q.nfcall(
    MongoClient.connect, 
    toDbConnectionString(dbSettings)) 
.then(function(db) { 
    return Q.ninvoke(db, "collectionNames"); 
}) 
.then(function(collections) { 
    console.log(collections); 
}) 
.catch(function() { 
    console.log(arguments); 
}); 

我想關閉顯示集合名稱後的連接,但有一個在這個匿名函數沒有分貝範圍內。

有沒有辦法如何處理承諾模式這種情況?

+0

爲什麼不抓住db'的'的價值,用它最後一步? – WiredPrairie

+0

我可以使用這個解決方案,但也許有一個更優雅的方式。 – shadeglare

+0

由於您通常應該只有一個連接到每個節點實例的數據庫,所以肯定會有預期的結果。此外,您必須考慮通常您需要在代碼中的其他地方使用它,因此它需要可訪問。例如,如果您想稍後統計每個集合的文檔數量(使用他們的集合名稱),該怎麼辦? – WiredPrairie

回答

3

你可以任意嵌套then -callbacks。是的,它接近厄運的金字塔,但它是保持論點範圍的唯一途徑。在你的情況下:

Q.nfcall(
    MongoClient.connect, 
    toDbConnectionString(dbSettings)) 
.then(function(db) { 
    return Q.ninvoke(db, "collectionNames") 
    .then(function(collections) { 
     console.log(collections); 
    }).finally(function() { 
     db.close(); 
    }); 
}) 
.catch(console.log.bind(console)); 

但是,請注意,你usually wouldn't connect and close too often

4

如果你不想做的嵌套(我當然不...),那麼你可以做像這樣:

var toDbConnectionString = function(dbSettings) { 
    return "mongodb://" + 
     dbSettings.user + ":" + 
     dbSettings.password + "@" + 
     dbSettings.url; 
}; 

var connectionString = toDbConnectionString(dbSettings); 
var db; 

Q.nfcall(
    MongoClient.connect, 
    toDbConnectionString(dbSettings)) 
.then(function(_db) { 
    db = _db; 
    return Q.ninvoke(db, "collectionNames"); 
}) 
.then(function(collections) { 
    console.log(collections); 
}) 
.catch(function() { 
    console.log(arguments); 
}) 
.finally(function() { 
    if (db) db.close(); 
});