路由分离与使用Express Router传递实例

5

我正在尝试拆分并组织所有路由。我已经成功做到了,但是遇到了一个问题。使用Express 4和路由器时,我在特定路由中传递实例时存在问题。例如,我想将Passport传递给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

这里的 passport 是未定义的。

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个回答

8

这里有两种方法可以实现,每种方法都有其优缺点。

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

例如:

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

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

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

这种方式的优点在于简单,但很多人(确实如此)认为,如果你正在进行单元测试,它不太容易进行测试,因为你不能像之前那样轻松地隔离待测试的文件等等。
因此,在这种情况下,每个模块文件将导出一个函数,通过函数接受其依赖项。例如,
/* 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中所做的那样。


loginRoutes的结尾处,你不需要返回router吗? - regularmike
方法2是“依赖注入”的一个例子吗? - chillpenguin
是的,那正是它的含义。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接