Node.js登录功能无法正常运行 浏览器提示重定向次数过多疑似陷入循环
重定向次数过多问题排查及修复方案
核心诱因:权限中间件逻辑错误(直接触发循环重定向)
你定义的secured中间件逻辑完全不符合权限校验的预期:
当前逻辑为:
- 判断用户已登录(存在
req.session.id_usuario)→ 重定向到/home - 判断用户未登录 → 重定向到
/admin/login
而/home路由本身就绑定了secured作为前置校验,只要你已登录,访问/home就会触发:访问/home → 进入secured中间件 → 已登录 → 重定向到/home → 再次进入secured中间件的无限循环,这就是重定向次数过多的直接原因。
正确的权限中间件逻辑应该是:已登录就放行调用next()执行后续路由渲染逻辑,未登录才跳转登录页。
其他需修复的错误点
- cookie-parser引入和调用错误:
依赖包名是cookie-parser,你写的require('cookieParser')拼写错误会找不到依赖;且应该用app.use(cookieParser())加载中间件,你误用了路由方法app.get()加载中间件,完全不生效。 - morgan重复引入:同时用ES模块
import和CommonJSrequire引入两次morgan,冗余且可能引发日志异常。 - 中间件加载顺序错误:session、cookie解析、请求体解析这类基础中间件需要放在所有路由定义之前加载,你当前的加载顺序会导致部分路由拿不到session、cookie值。
修复后代码
import express from "express"; import config from "./config"; import morgan from "morgan"; import cors from "cors"; import path from "path"; import session from 'express-session'; import cookieParser from 'cookie-parser'; import loginRouter from './routes/admin/login'; import contact from "./routes/contact"; const app = express(); app.set("PORT", config.PORT); // 基础中间件统一放在最前面 app.use(cors()); app.use(morgan('dev')); app.use(express.urlencoded({ extended: false })); app.use(express.json()); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use(session({ secret:'dasajk453sdhas234dkl534jasdjk', resave:false, saveUninitialized:true })); // 模板配置 app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'hbs'); // 修复后的权限中间件 var secured = async(req,res,next) => { try{ if(req.session.id_usuario){ // 已登录直接放行 next(); }else{ // 未登录跳登录页 res.redirect('/admin/login'); } }catch(error){ console.log(error) next(error); } } // 路由定义 app.get("/", (_, res) => res.render("admin/login.hbs")); app.use("/contact", contact); app.use('/admin/login', loginRouter); app.get("/home", secured, (req, res)=>res.render("index.hbs")); export default app;
内容的提问来源于stack exchange,提问作者Victoria Sztern
相关产品推荐
相关产品推荐

