如何导出仅在异步回调中可用的对象?

Šim*_*das 5 javascript mongodb node.js express

我有一个db.js文件,我在其中设置MongoDB连接.我想将数据库对象导出到我的主app.js文件中:

// db.js
require('mongodb').MongoClient.connect(/* the URL */, function (err, db) {
    module.exports = db;
});

// app.js
var db = require('./db');

app.get('/', function (req, res) {
    db.collection(/* … */); // throws error
});
Run Code Online (Sandbox Code Playgroud)

错误是:

TypeError:对象#没有方法'集合'

那么,我该如何db正确导出对象呢?

Dan*_*mov 3

正如elclanrs评论中所建议的最好的选择是导出承诺:

\n\n
// database.js\nvar MongoClient = require(\'mongodb\').MongoClient,\n    Q = require(\'q\'),\n    connect = Q.nbind(MongoClient.connect, MongoClient);\n\nvar promise = connect(/* url */);        \n\nmodule.exports = {\n  connect: function () {\n    return promise;\n  }\n}\n\n// app.js\nvar database = require(\'./database\');\n\ndatabase.connect()\n  .then(function (db) {\n    app.get(\'/\', function (req, res) {\n      db.collection(/* \xe2\x80\xa6 */);\n    });\n  })\n  .catch(function (err) {\n    console.log(\'Error connecting to DB:\', err);\n  })\n  .done();\n
Run Code Online (Sandbox Code Playgroud)\n\n

(我在这里使用很棒的Q库。)

\n\n
\n\n

下面是我答案的旧版本,为了历史而留下(但如果你不想使用承诺,而不是走那条路,你应该使用马特的答案)。

\n\n

它的缺点是每次你打开一个连接require(\'database.js)(真糟糕!)

\n\n
// DO NOT USE: left for the sake of history\n\n// database.js\nvar MongoClient = require(\'mongodb\').MongoClient;\n\nfunction connect(cb) {\n  MongoClient.connect(/* the URL */, cb);\n}\n\nmodule.exports = {\n  connect: connect\n}\n\n// app.js\nvar database = require(\'./database\');\n\ndatabase.connect(function (err, db) {\n  app.get(\'/\', function (req, res) {\n      db.collection(/* \xe2\x80\xa6 */);\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我猜,或者也许出口一个承诺,然后连锁? (2认同)