Express Js Mongodb 初始连接设置困难

Expressjs Mongodb inital connection setup difficulties

在谷歌上搜索了很多关于如何在 Express/NodeJs 应用程序中设置 MongoDb 之后,我认为我知道如何以 decent/performant 的方式实现它。我在 Express 提供给我的 WWW 文件中启动了我的 mongodbConnection,因此在应用程序启动时只有 1 个连接被打开。

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 的初始化中设置 console.log() 语句时,我清楚地看到 de 数据库变量已设置!

如有任何帮助,我们将不胜感激!

我没看到哪里需要 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);
        }
    });
};

您可以尝试这样的操作:

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

routes/index.js

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