2015-10-21 133 views
4

在我的項目中有很多數據庫,其中一個是masterDb,另一個是基於masterDb的數據庫連接。例如,在驗證頁面中,用戶可以輸入'公司ID',可以使用masterDb檢查'公司ID',如果存在ID,則返回特定公司的數據庫名稱。使用我想連接到特定公司數據庫的數據庫名稱。如何使用貓鼬動態連接多個mongodb數據庫?

現在我可以成功登錄並獲取數據庫名稱。使用這個數據庫名稱(req.headers ['x-key-db'])我可以連接到特定的數據庫。但是在這裏我將數據庫連接代碼放在每個api調用中。有沒有其他的方法來創建一次,並動態地在每個API調用中使用它。

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

回答

9

您可以創建一個模塊,像下面這將檢查數據庫需要數據庫連接已經存在。如果是,它將返回連接對象,否則它將創建一個並返回它。

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']; 
    }  
} 

假設您將上面的文件命名爲​​。你只需要在你有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}); 
      }); 
     } 
    }); 
}); 
+0

謝謝您的回答。數據庫連接正常工作。 :) –

+0

沒問題:)在這種情況下,你能接受我的答案嗎? – Raeesaa