【问题标题】:Node.js: Using Promises with MongoDbNode.js:在 MongoDb 中使用 Promise
【发布时间】:2013-10-07 09:54:53
【问题描述】:

我已经开始在一个简单的 node.js 应用程序中使用 Q 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);
});

我想在显示集合名称后关闭连接,但此匿名函数中没有数据库上下文。

有没有办法用 promise 模式处理这种情况?

【问题讨论】:

  • 为什么不捕获db的值并在最后一步使用它?
  • 我可以使用这个解决方案,但也许有更优雅的方式。
  • 由于每个节点实例通常应该只有一个与数据库的连接,因此这当然是意料之中的。此外,您必须考虑到通常您需要在代码中的其他位置使用它,因此它需要可访问。例如,如果您想稍后计算每个集合的文档数(使用它们的集合名称)怎么办?
  • 您可能对mongojs 感兴趣,它提供了更友好的 API 并为您自动连接,mongod 在此基础上通过提供承诺而不是回调作为 API 来构建跨度>

标签: node.js mongodb promise


【解决方案1】:

你可以任意嵌套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

【讨论】:

    【解决方案2】:

    如果您不想进行嵌套(我当然不想...),那么您可以这样做:

    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();
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2014-04-16
      • 2016-05-04
      相关资源
      最近更新 更多