Express-Session在Router中无法正常工作的问题求助
问题分析与解决方案
嘿,我帮你定位到两个关键问题啦,这就是为什么你在路由里赋值的会话无法被正确读取:
1. 变量名完全不匹配(大小写+下划线问题)
JavaScript是大小写敏感的语言,而且下划线也是变量名的一部分,你代码里的变量名完全不一致:
- 在
auth.js里你赋值的是req.session._inside(下划线+全小写的inside) - 但在会话检查中间件里你打印的是
req.session._inSide(下划线+inSide,这里的S是大写),后来你描述里又写成了req.session.inSide(无下划线+大写S)
这就好比你把东西放进了标着_inside的抽屉,却去翻标着_inSide的抽屉,当然找不到啦!
2. 会话检查中间件只处理GET请求
你用app.get('/*')定义的中间件,只会匹配GET类型的请求,而你的登录接口是POST请求(auth.post('/login')),所以当你发送登录请求时,这个中间件根本不会执行。你看到的日志应该是登录完成后发送的GET请求的输出,但因为变量名错误,还是显示undefined。
修正后的代码示例
修正后的app.js
const express = require('express'); const app = express(); const session = require('express-session'); // 先挂载session中间件,这个顺序是对的,必须在所有需要用session的路由/中间件之前 app.use(session({ secret: 'D$YTRH#%#$@^$#YR', resave: false, saveUninitialized: true, })); // 用app.use替代app.get,匹配所有HTTP方法的请求 app.use('/*', (req, res, next) => { req.session.outSide = "outSideBlah"; next(); }); // 同样用app.use,确保所有请求都经过这个检查中间件 app.use('/*', (req, res, next) => { // 统一变量名,和auth.js里保持一致 console.log(req.session.inside); console.log(req.session.outSide); next(); }); // 挂载auth路由 const auth = require('./routes/auth.js')(express); app.use('/auth', auth); app.listen(3000, () => console.log('Server running on port 3000'));
修正后的auth.js
module.exports = (express) => { const auth = express.Router(); auth.post('/login', (req, res) => { // 和中间件里的变量名完全统一,去掉不必要的下划线(当然保留也可以,只要全项目一致) req.session.inside = 'insideBlah'; // 这里加上你的认证逻辑... res.status(200).send('登录成功'); // 别忘了给客户端返回响应 }); return auth; };
验证效果
- 启动服务后,发送POST请求到
/auth/login完成登录 - 再发送任意GET请求(比如访问根路径
/),你会看到控制台输出:insideBlah outSideBlah
这样就能正常读取到路由里赋值的会话变量啦!
内容的提问来源于stack exchange,提问作者김기현
相关产品推荐
相关产品推荐

