2016-11-27 97 views
1

我一直在玩NodeJS和Express幾天,它非常酷。但是我遇到了一個我無法解決的問題,所以我希望其他人能夠幫助我解決這個問題。ExpressJS - 帶參數的路由器模塊

我知道我可以聲明一個模塊,然後通過require方法將參數傳遞到此模塊中。

--- App.js ---- 
var foo = require('./modules/Foo.js'); 
    foo.config(); 
var bar= {} 
    require('./modules/Bar.js)(bar, foo) 

--- Bar.js --- 
module.exports = function(Bar, Foo) { 
    Bar.act = function(){ 
      Foo.do(); 
    } 
} 

我認爲這是一個不必要求Foo每一個需要使用它模塊中更清潔的設計。我也不需要在每個需要它的模塊中進行初始化。

但後來到Router,我真的不明白它是如何工作的。在那裏大多數示例要求每個模塊中的路由器,是這樣的:

--- App.js ---- 
var index = require('./views/index.js'); 
app.use('/', index); 

--- Index.js --- 
var express = require('express'); 
var router = express.Router(); 
var foo = require('../modules/Foo.js); 

foo.config(); 

router.get('/', function (req, res) { 
    foo.do(); 
    res.render('index'); 
}) 

module.exports = router 

但後來,我需要需要手動index.js使用的所有模塊。我真的想要做的是這樣的:

--- App.js ---- 
var foo = require('../modules/Foo.js); 
    foo.config(); 
var index = require('./views/index.js')(foo); 
app.use('/', index); 

--- Index.js --- 
var express = require('express'); 
var router = express.Router(); 

module.exports = function(foo){ 
    router.get('/', function (req, res) { 
     foo.do(); 
     res.render('index'); 
    }) 
} 

但是寫這種方式,編譯器告訴我「Router.use()要求的中間件,有一個不確定的」。我可以看看這個錯誤來自哪裏(module.exports沒有返回對象),但是我怎麼構造我的代碼,以便我可以將參數傳遞給模塊,最終將導出一個路由器中間件?我想在一個地方要求並初始化Foo,然後將它傳遞給所有使用它的路由器模塊。以某種方式可能嗎?

回答

1

你差點拿到了,你只需要返回Router

固定index.js看起來是這樣的:

var express = require('express'); 

module.exports = function(foo){ 
    var router = express.Router(); 

    router.get('/', function (req, res) { 
     foo.do(); 
     res.render('index'); 
    }); 

    return router; 
} 

注意附加;和回報。

我也已經將路由器的實例化移至該函數。在節點模塊cached中,您可以多次請求相同的模塊,並且它們都將共享其全局變量。這可能會導致意想不到的結果。在你的情況下,你將每次覆蓋router.get處理程序,並且每個請求將使用相同的Foo實例。

+1

它工作。非常感謝^ ^ – Gikkman