Node.js Express中app.use注册的全局登录中间件完全不执行如何解决
问题根因
Express 中间件是严格按照代码中注册的先后顺序执行的,你编写的登录全局中间件注册位置太靠后:
- 所有正常请求会被你先注册的
indexRouter、usersRouter匹配处理,处理完成后请求链路就结束了,不会走到后续中间件 - 没有匹配到路由的异常请求会被404中间件捕获,也走不到你写的登录中间件
修复方案
调整代码顺序,把登录中间件、数据库读取逻辑都移到业务路由注册之前即可,调整后的核心代码顺序如下:
// ...省略其他包引入、基础中间件注册代码 app.use(session({secret:"Javascript FrontEnd Validation"})); app.use(cors()); // 先读取用户数据库 let usersDatabase = JSON.parse(fs.readFileSync(path.resolve(__dirname, './database/users.json'))); // 再注册全局登录中间件 app.use((req, res, next) => { console.log("this is executing") res.locals.usuario = false; if(req.session.usuario){ res.locals.usuario = req.session.usuario; return next(); }else if(req.cookies.email){ let usuario = usersDatabase.find(usuario => usuario.email == req.cookies.email); // 额外优化:加存在判断,避免找不到用户时报错 if(usuario) { delete usuario.password req.session.usuario = usuario; res.locals.usuario = usuario; } return next(); } else{ return next(); } }); // 最后注册业务路由 app.use('/', indexRouter); app.use('/users', usersRouter); // ... 后面的404、错误处理中间件保持原来位置即可
内容的提问来源于stack exchange,提问作者Ramiro Manuel Estevez
相关产品推荐
相关产品推荐

