如何在不同模块

时间:2017-04-23 07:55:03

标签: javascript node.js mongodb

我想将MongoDB连接对象用于不同的模块。问题是每当我的app.js运行它应该实例化然后我可以传递给模块的其他功能。 基本上Mongo连接应该只创建一次,

目前我只想调用MongoDb时使用此代码。如何在回调函数之外重用MongoDb连接对象。

var mongodb = require("mongodb");

mongodb.MongoClient.connect(url, function (err, db) {
    if (err) {
        console.log(err);
        process.exit(1);
      }
     // Save database object from the callback for reuse.
     console.log("Database connection ready");
});

//let say here i want to use 
db.collection("cname").find({}) //but i am getting db as undefined.

1 个答案:

答案 0 :(得分:0)

错误的好主意"将使用较高范围中的其他变量来存储您的数据库实例:

var mongodb = require("mongodb");
var dbInstance;

mongodb.MongoClient.connect(url, function (err, db) {
    if (err) {
        console.log(err);
        process.exit(1);
      }
     // Save database object from the callback for reuse.
     console.log("Database connection ready");
     dbInstance = db;
});
// Here I don't know if dbInstance is define or not -> big problem!

但是,如果这看起来是个好主意,那就不是了。它会给你一个关于dbInstance未定义的错误。 mongodb.MongoClient.connect是异步的,因此在使用" dbInstance"之前,您需要等待回调。 最好使用您将db实例作为参数传递的函数:

var mongodb = require("mongodb");
var myModule = require("myModule")
var useDbInstance = function useDbInstance(dbInstance) {    
    //let say here i want to use 
    dbInstance.collection("cname").find({});
    myModule(dbInstance)
        .doSomething();
};

mongodb.MongoClient.connect(url, function (err, db) {
    if (err) {
        console.log(err);
        process.exit(1);
      }
     // Save database object from the callback for reuse.
     console.log("Database connection ready");
     useDbInstance(db);
});

然后你可以将你的代码包装在Promises中,以便更好地控制异步流并避免回调地狱"。

我希望这会有所帮助:)