如何使用mongoosedynamic连接多个mongodb数据库?

在我的项目中有很多数据库,一个是masterDb,另一个是基于masterDb的数据库连接。 例如,在validation页面中,用户可以input“公司ID”,可以使用masterDb检查该“公司ID”,如果存在ID,则返回特定公司的数据库名称。 使用我想连接到特定公司数据库的数据库名称。

现在我可以成功login,并获得数据库名称。 使用这个数据库名称(req.headers ['x-key-db'])我可以连接到特定的数据库。 但是在这里我把数据库连接代码放在每个API调用中。 有没有其他方法来创build一次,并dynamic地在每个API调用中使用它。

app.get('/api/student-limited/:_pageNumber/:_pageSize', function(req, res) { var db = mongoose.createConnection(); db.open('mongodb://localhost:27017/'+req.headers['x-key-db']); var ClassSection = db.model('ClassSections', SectionSchema); var Student = db.model('Students', StudentSchema); var _pageNumber = parseInt(req.params._pageNumber), _pageSize = parseInt(req.params._pageSize); Student.find({}, function (err, _docs) { if(_docs){ Student.find({}, null, {sort: { Name: 1} }).skip(_pageNumber > 0 ? ((_pageNumber-1)*_pageSize) : 0).limit(_pageSize).populate('_idClass').exec(function (err, docs) { if(err) res.json(err); else res.json({ "TotalCount" : _docs.length, "_Array" : docs}); }); } }); }); 

你可以创build一个像下面这样的模块来检查数据库连接是否已经存在。 如果是,它将返回连接对象,否则它将创build一个并返回它。

 var mongoose = require('mongoose'); //Object holding all your connection strings var connections = {}; exports.getDatabaseConnection = function(dbName) { if(connections[dbName]) { //database connection already exist. Return connection object return connections['dbName']; } else { connections[dbName] = mongoose.createConnection('mongodb://localhost:27017/' + dbName); return connections['dbName']; } } 

假设你将上面的文件命名为data.js 你只需要在你有你的API代码的文件中需要这个模块。 而你的API代码将被改变成如下所示:

 app.get('/api/student-limited/:_pageNumber/:_pageSize', function(req, res) { //Call getDatabaseConnection function we created var db = data.getDatabaseConnection(req.headers['x-key-db']); var ClassSection = db.model('ClassSections', SectionSchema); var Student = db.model('Students', StudentSchema); var _pageNumber = parseInt(req.params._pageNumber), _pageSize = parseInt(req.params._pageSize); Student.find({}, function (err, _docs) { if(_docs){ Student.find({}, null, {sort: { Name: 1} }).skip(_pageNumber > 0 ? ((_pageNumber-1)*_pageSize) : 0).limit(_pageSize).populate('_idClass').exec(function (err, docs) { if(err) res.json(err); else res.json({ "TotalCount" : _docs.length, "_Array" : docs}); }); } }); });