这是一种方法。您可以将数据库连接详细信息放在一个小模块中,在应用程序启动时初始化它,然后从需要数据库连接的任何其他模块中使用该模块。这是我一直在使用并且对于我而言在一个相当简单的内部应用程序中运作良好的代码。
文件:DataAccessAdapter.js
var Db = require('mongodb').Db;
var Server = require('mongodb').Server;
var dbPort = 27017;
var dbHost = 'localhost';
var dbName = 'CatDatabase';
var DataBase = function () {
};
module.exports = DataBase;
DataBase.GetDB = function () {
if (typeof DataBase.db === 'undefined') {
DataBase.InitDB();
}
return DataBase.db;
}
DataBase.InitDB = function () {
DataBase.db = new Db(dbName, new Server(dbHost, dbPort, {}, {}), { safe: false, auto_reconnect: true });
DataBase.db.open(function (e, d) {
if (e) {
console.log(e);
} else {
console.log('connected to database :: ' + dbName);
}
});
}
DataBase.Disconnect = function () {
if (DataBase.db) {
DataBase.db.close();
}
}
DataBase.BsonIdFromString = function (id) {
var mongo = require('mongodb');
var BSON = mongo.BSONPure;
return new BSON.ObjectID(id);
}
然后在server.js中,当你的应用程序启动时:
// Startup database connection
require('./DataAccessAdapter').InitDB();
当您需要使用数据库时,例如在您的“Cat.js”文件中,您可以执行以下操作:
var dataAccessAdapter = require('./DataAccessAdapter');
var Cat = function () {
if (!Cat.db) {
console.log('Initializing my Cat database');
Cat.db = dataAccessAdapter.GetDB();
}
if (!Cat.CatCollection) {
console.log('Initializing cats collection');
Cat.CatCollection = Cat.db.collection('Cats');
}
return Cat;
}
module.exports = Cat;
Cat.Name = null;
Cat.HasFur = false;
Cat.Read = function (catId, callback) {
var o_id = dataAccessAdapter.BsonIdFromString(catId);
Cat.CatCollection.findOne({ '_id': o_id }, function (err, document) {
if (!document) {
var msg = "This cat is not in the database";
console.warn(msg);
callback(null, msg);
}
else {
callback(document);
}
});
}
我希望这至少对看问题的另一种方式有所帮助。我不自诩为专家,并乐于接受一些来自SO的反馈,但迄今为止,这个解决方案对我来说效果很好。