在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数据库变量被设置了!
非常感谢任何帮助!
答案 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
});
...