我正在尝试仅为某些路由(身份验证路由)包含会话但由于错误页面路由而遇到问题:
我有这个:
app.use(session({
secret: config.secrets.session,
saveUninitialized: false,
resave: false,
store: sessionStore,
proxy: true,
cookie: {
maxAge: config.token_duration,
secure: false
}
// rolling: false
}));
app.use('/api/user', require('./api/user'));
app.use('/api/auth', require('./api/auth'));
app.route(['/error/500','/error/404','/user/settings'])
.get((req, res) => {
res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
});
app.route('/*/*')
.get(errors[404]);
app.use(errors[500]);
所以,如果我像这样使用它,我的应用程序中的所有页面都将创建一个会话(我不想要)。如果我在错误路由之后移动会话部分,我将永远不会到达api路由,因为它将到达404路由。
提前致谢
答案 0 :(得分:5)
中间件只能与某些路由相关联,并且其中指定的顺序很重要。有很多方法可以做到这一点,如何最好地实现它取决于您的站点使用的路径以及如何最容易地在路径之间建立链接以及它是否应该或不应该有会话中间件。
一件简单的事情就是在会话中间件之前放置错误路由处理程序。然后,那些路由处理程序将处理"首先是请求,会话中间件永远不会被调用。
app.route(['/error/500','/error/404','/user/settings'])
.get((req, res) => {
res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
});
app.use(session({
secret: config.secrets.session,
saveUninitialized: false,
resave: false,
store: sessionStore,
proxy: true,
cookie: {
maxAge: config.token_duration,
secure: false
}
// rolling: false
}));
你可以做的其他事情:
在会话中间件上放置一个路径,以便仅针对您网站中的某些路径调用它(所有经过身份验证的页面都应该在该路径下方)。
创建自己的中间件处理程序,检查路径是否为/error
,如果不是,则调用会话中间件处理程序。如果是/error
,则不要调用会话中间件。
最后一个可以这样做:
const sessionHandler = session({
secret: config.secrets.session,
saveUninitialized: false,
resave: false,
store: sessionStore,
proxy: true,
cookie: {
maxAge: config.token_duration,
secure: false
}
// rolling: false
});
app.use(function(req, res, next) {
// if path does not start with /error/, then invoke session middleware
if (req.url.indexOf("/error/") !== 0) {
return sessionHandler(req, res, next);
} else {
next();
}
});
答案 1 :(得分:1)
您也可以使用Express.router()链接/组成多个中间件,如本示例中所述:Express: composing middleware
然后将组成的(链接中间件的)路由器用作特定的路由处理程序。