2013-10-01 60 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(); 
});