2015-01-20 69 views
0

在Google/ExpressJs應用程序中如何設置MongoDb之後,我認爲我知道如何以體面/高性能的方式實現它。我在Express提供給我的WWW文件中啓動我的mongodbConnection,因此在應用程序啓動時只打開1個連接。Expressjs Mongodb初始連接建立困難

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文件I制定出實際的數據庫初始化和我導出數據庫變量。

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數據庫變量已設置!

任何幫助將不勝感激!

回答

1

我看不到mastermanager.js是必需的,但module.exports.db設置在您的回調中,在需要mastermanager.js之後可能會執行很長時間。

只是猜測,但你可以嘗試移動數據庫的聲明,直到你究竟要使用它,像這樣:

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); 
     } 
    }); 
}; 
+0

如果我這樣做,它確實有用!但我真的不知道它爲什麼這樣工作...你的解決方案和我的工作解決方案之間的概念區別是什麼? – Martijn 2015-01-21 17:43:38

+1

在** mongoconnection.js **中,'module.exports.db = database;'僅在'MongoClient.connect'完成後調用 - 這可能需要一些時間(可能是秒)。它是在** mongoconnection.js **被任何使用的'require()'編寫時啓動的,但它可能實際上並沒有完成一段時間。另一方面,當需要** mastermanager.js **時,代碼中的'var db = mongoConnection.db;'也會被執行(它使用賦給'module.exports.db'的值)。在更新後的代碼中,只有在調用getCollection()時纔會執行 - 大概在MongoClient.connect完成後的一段時間。 – 2015-01-21 19:52:47

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