2012-04-02 84 views
10

我使用ExpressJs和Node.js,並把我所有的路由放到'路由'文件夾中。ExpressJS並在單獨的路由文件之間傳遞變量

在服務器上,我做我的DB連接,然後確定我的路線,像這樣:

var routes = require('./routes'); 

var db; 
dbconnect = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {}); 
dbconnect.open(function (err, db) { 

    db.authenticate(config.mongo_user, config.mongo_pass, function (err, success) { 
    if (success) { 

     //routes/index.js 
     app.get('/', routes.index); 

     //routes/users.js 
     app.get('/users', routes.users); 

    } 
    }); 
}); 

我想訪問內每個路線JavaScript文件的「DB」的對象。我如何將這個'app.js'文件傳遞給index.js或users.js?

謝謝!

回答

4

一個建議是通過它接受db參數的函數來公開路線:

routes.js:

module.exports = function(db) { 
    return { 
     index: function(req, res, next) { 
      // Funky db get stuff 
     } 
    } 
} 

包裝值在這樣的閉合並返回與多個功能的目的是一種有用的模式,有時稱爲「揭示模塊模式」。它清楚地顯示了依賴關係,允許輕鬆測試(例如使用模擬db對象),同時仍然使用靈活的功能方法。

+4

缺點是現在每次你想在控制器中重複使用一個「模塊」時,你必須將它添加到簽名中,最後可能會出現一些控制器需要2個,一個需要3個,另一個需要5個的情況,現在你已經有了一個必須容納最大共同點的簽名。我認爲更好的方法是將你的數據庫行爲封裝在它自己的鬆耦合模塊中。 – 2012-04-02 20:43:19

+2

@BradHarris:這絕對是一個缺點。如果您覺得這一點很重要,那麼保留相同簽名的一種方法是接受帶有參數的對象:'{db:db,foo:foo,bar:bar}'。你的解決方案絕對不是一個很好的解決方法,儘管它有自己的缺點 - 比如單元測試更難。 – 2012-04-25 16:30:10

13

如果您在自己的文件/模塊中編寫數據庫抽象,那麼您可以根據需要在需要時通過require()將其重用到整個代碼庫中。如果你寫得正確,它將不會被重新創建,並且可以像應用程序一樣在應用程序啓動時初始化一次。

//contents of your database.js file 
var database; 

module.exports = { 

    init : function(config, cb) { 
     database = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {}); 
     database.open(function (err, db) { 
      db.authenticate(config.mongo_user, config.mongo_pass, cb); 
     }); 
    }, 

    query : function(params, cb) { 
     database.query(params, cb); 
    } 

}; 

這是一個微不足道的例子,但希望它能得到重點。在控制器或者你需要一個數據庫對象的任何文件,你只是......

var db = require('database'); 

db.init(params, function(err, db) { 
    ... 
}); 


db.query(params, function(err, db) { 
    ... 
}); 

的好處是,你現在可以在任何地方使用你的應用程序一樣,通過任何其他節點模塊鬆耦合的數據庫對象要求聲明。

+2

我喜歡這個。另一個有用的模式是將一個對象表示爲應用程序(或應用程序資源)作爲對象。例如。 require('./ myapp.js')。db或require('./ myapp.js')。config – Prestaul 2012-04-02 21:06:37