ExpressJS – 带参数的路由器模块
我一直在玩NodeJS和Express几天,这很酷。 但是我遇到了一个问题,我无法摆脱困境,所以我希望有其他人能够帮助我解决这个问题。
我知道我可以声明一个模块,然后通过require
方法将parameter passing到这个模块中。
--- 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(); } }
我认为这是一个更清洁的devise,而不是在需要使用它的每个模块中都需要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()需要中间件,得到了一个未定义的”。 我可以sorta看看这个错误来自哪里( module.exports
不返回一个对象),但是如何构造我的代码,以便我可以传递参数到一个模块,最终将导出一个路由器中间件? 我想在一个地方要求并初始化Foo
,然后将它传递给所有使用它的路由器模块。 有没有可能?
你几乎可以得到它,你只需要返回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; }
注意额外的;
和回报。
我也将路由器的实例化移到了函数中。 在节点中caching模块,你可以多次需要相同的模块,它们将共享它们的全局variables。 这可能会导致意想不到的结果。 在你的情况下,你将每次覆盖router.get
处理程序,同一个Foo
实例将被用于每个请求。