如何解决全局登录校验中间件引发的无限重定向循环?
解决登录验证中间件无限重定向并排除指定路由的问题
你的无限重定向循环是因为应用级中间件会拦截所有请求,包括/login路由。当未登录用户访问/login时,中间件检测到req.user不存在,会重定向到/login,进而再次触发中间件,形成死循环。
要通过app.use(loginCheck)实现全局应用中间件但排除/login路由,有两种可行方案:
方案一:在中间件内部排除指定路径
直接修改中间件代码,判断当前请求路径是否为/login,如果是则直接放行,不做登录验证:
module.exports = (req, res, next) => { // 排除登录页面请求,直接放行 if (req.path === '/login') { return next(); } // 非登录页面执行登录验证逻辑 if (req.user === undefined) { console.log('Login Required'); return res.redirect('/login'); } next(); };
修改后直接使用app.use(loginCheck)即可,中间件会自动跳过/login路由,避免重定向循环。如果后续需要排除其他路由(比如注册页/register),可以扩展判断条件:
if (['/login', '/register'].includes(req.path)) { return next(); }
方案二:通过app.use的路径匹配规则排除路由
利用正则表达式匹配除/login之外的所有路径,再应用中间件:
// 正则匹配:以/开头,且后面不是login(精确匹配/login) app.use(/^\/(?!login$)/, loginCheck);
这种方式无需修改中间件代码,但正则匹配需要注意路径的精确性,比如不会排除/login/xxx这类嵌套路径,适合路由规则简单的场景。
内容的提问来源于stack exchange,提问作者고태성
相关产品推荐
相关产品推荐

