使用快速路由器和传递实例进行路由分离

Mr.*_*1.0 5 node.js express

所以我试图将我的所有路线分开并组织起来.我已设法做到这一点,但我遇到了一个问题.使用express 4和路由器我在将某个实例传递给特定路由时遇到问题.例如,我想将护照传递给login.js文件.我该怎么办?我这样做是否正确,还是有更好的清洁解决方案?

//app.js

var express = require('express');
var passport = require('passport');
var app = express();

require('./routes')(app, passport);
Run Code Online (Sandbox Code Playgroud)

//routes.js

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

//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;
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 8

所以人们有两种方式做到这一点,每种方式都有利有弊.

最简单的方法是将您的护照配置在您自己的文件中(即您设置所有护照策略等),并且该文件在设置后导出护照对象.

例如

/* in ./lib/passport.js */
module.exports = passport;
Run Code Online (Sandbox Code Playgroud)

然后在其他需要它的文件中,你只需要你的护照文件(其中的代码只被调用一次,之后导出的模块被缓存).

/* in some other file */
var passport = require('./lib/passport');
Run Code Online (Sandbox Code Playgroud)

这有简单的优点,但是很多人都觉得(这是正确的),如果你正在进行单元测试,它就不那么可测试了,b/c你不能轻易地隔离测试文件等等.

所以在这种情况下,每个模块文件都会导出一个函数,该函数通过函数获取其依赖关系.例如,

/* 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;
Run Code Online (Sandbox Code Playgroud)

然后,只要您将路由拉入应用程序,该过程只需要路由文件并调用该函数,并将其传递给护照实例.这看起来就像你在routes.js中所做的那样.