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
});
...
在谷歌上搜索了很多关于如何在 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
});
...