在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數據庫變量已設置!
任何幫助將不勝感激!
如果我這樣做,它確實有用!但我真的不知道它爲什麼這樣工作...你的解決方案和我的工作解決方案之間的概念區別是什麼? – Martijn 2015-01-21 17:43:38
在** 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