Expressjs Mongodb初始连接设置困难

时间:2015-01-20 22:23:19

标签: javascript node.js mongodb express

在googling很多关于如何在Express / NodeJs应用程序中设置MongoDb后,我想我知道如何以体面/高效的方式实现它。我在Express提供给我的WWW文件中启动了mongodbConnection,因此在应用程序启动时只打开了一个连接。

WWW

!/usr/bin/env node
var debug = require('debug')('myapp');
var app = require('../app');
var mongoConnection = require('../mongo/mongoconnection.js');

mongoConnection.init(function(error){
    // Start the application after the database connection is ready
    app.set('port', process.env.PORT || 3000);

    var server = app.listen(app.get('port'), function() {
        debug('Express server listening on port ' + server.address().port);
    });
});

在我的mongoConnection.js文件中,我计算出数据库的实际初始化,并导出数据库变量。

mongoconnection.js

var mongodb = require('mongodb');
var bson = mongodb.BSONPure;
var MongoClient = mongodb.MongoClient;

// Initialize connection once
module.exports.init = function(callback)
{
    MongoClient.connect("mongodb://localhost:27017/capturemongo", function(err, database) {
        if(err) throw err;
        module.exports.db = database;
        callback(err);
    }); 
};

但是,当我尝试从mastermanager.js文件访问数据库变量时,db变量未定义。

mastermanager.js

var mongoConnection = require('./mongoconnection.js');
var db = mongoConnection.db;

module.exports.getCollection = function( callback){
    db.collection('masters', function(err, collection){
        if(!err){
            callback(null, collection);
        }
        else{
            console.log("getcolelction error " + err);
            callback(err);
        }
    });
};

module.exports.findAll = function(callback) {
    this.getCollection(function(error, collection) {
      if( error ){
          callback(error);
      }
      else {
        collection.find().toArray(function(error, results) {
          if( error ) {
              callback(error);
              console.log('finderror ' + error);
          }
          else{ 
              console.log(results);
              callback(null, results);
          }
        });
      }
    });
};

我真的无法弄清楚为什么变量在那里未定义。当我在mongoconnection的init中设置console.log()语句时,我清楚地看到de数据库变量被设置了!

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

我不知道mastermanager.js在哪里需要,但是在你的回调中设置了module.exports.db,这可能是在需要mastermanager.js之后很久才执行的。

只是猜测,但您可能会尝试移动db的声明,直到您真正要使用它,如下所示:

module.exports.getCollection = function( callback){
    var db = mongoConnection.db;
    db.collection('masters', function(err, collection){
        if(!err){
            callback(null, collection);
        }
        else{
            console.log("getcolelction error " + err);
            callback(err);
        }
    });
};

答案 1 :(得分:0)

您可以尝试这样的事情:

<强> WWW

...    
let _db = null;

MongoClient.connect('mongodb://localhost:27017/capturemongo', (err, db) => {
    _db = db;
});

app.use(function(req, res, next) {
    res.locals.db = _db;
    next();
});
...

<强>路由/ index.js

...
router.get('/', function(req, res) {
    res.locals.db; //Do something with the db connection
});
...