所以我试图将所有路线分开并组织起来。我设法做到了,但我遇到了一个问题。使用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;
答案 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中所做的那样。