与快速路由器路由分离并通过实例

所以我试图分开我所有的路线和组织他们。 我设法做到这一点,但我面临一个问题。 使用快递4,和路由器我有一个问题的东西传递到一个特定的路线。 例如,我想将护照传递给login.js文件。 我该怎么做? 我是以正确的方式做这件事吗,还是有更好的更清洁的解决scheme?

//app.js

var express = require('express'); var passport = require('passport'); var app = express(); require('./routes')(app, passport); 

//routes.js

 module.exports = function (app, passport) { app.use('/', require('./routes/index')); app.use('/', require('./routes/login')(passport)); app.use('/', require('./routes/register')(passport)); }; 

//login.js

这里的护照是未定义的。

 var express = require('express'); var router = express.Router(); router.get('/login', function (req, res) { res.render('login', { title: 'login', message: req.flash('loginMessage') }); }); router.post('/login', passport.authenticate('local-login', { successRedirect : '/profile', failureRedirect : '/login', failureFlash : true })); module.exports = router; 

所以有两种方法可以做到这一点,每个方面都有优点和缺点。

最简单的方法是将你的护照configuration到你自己的文件中(比如你设置了所有的护照策略等等),然后该文件在设置完成后导出护照对象。

例如

 /* in ./lib/passport.js */ module.exports = passport; 

然后在其他一些需要它的文件中,你只需要你的护照文件(那里的代码只被调用一次,然后导出的模块被caching)。

 /* in some other file */ var passport = require('./lib/passport'); 

这有简单的优点,但是很多人都觉得(如此),如果你正在进行unit testing,那么你不能很容易地testing,因为你不能很容易地隔离被testing的文件等等。

所以在这种情况下,每个模块文件将通过一个函数导出一个依赖于其依赖的函数。 例如,

 /* in your router file */ var router = require('express').Router(); var loginRoutes = function(passport){ router.post('/login', passport.authenticate('local-login', { successRedirect: '/profile', failureRedirect: '/login' })); return router; }; module.exports = loginRoutes; 

那么无论您将路由拉入应用程序,该进程只需要路由文件并调用该函数,并将其传递给Passport实例。 这看起来像你在routes.js中所做的一样。