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

时间:2014-08-06 03:56:28

标签: node.js express

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

// 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;

1 个答案:

答案 0 :(得分:8)

所以人们有两种方式做到这一点,各有利弊。

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

e.g。

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

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

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

这具有简单的优点,但是很多人都觉得(这是正确的),如果你正在进行单元测试,它就不那么可测试了,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;

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