Express中使用client-sessions报TypeError: Cannot read 'isAdmin'属性错误求助
TypeError: Cannot read property 'isAdmin' of undefined 的问题 这个错误的核心很明确:你尝试访问 req.session.isAdmin 时,req.session 本身是 undefined。咱们一步步拆解问题,逐个排查修复:
1. 优先检查 secure: true 的配置坑
你在session配置里设置了 secure: true,这个选项的作用是:浏览器只会在HTTPS连接下保存这个session cookie。如果你的本地开发是用普通HTTP协议(比如直接跑 http://localhost:3000),浏览器根本不会接收这个cookie,直接导致 req.session 一直是 undefined。
快速修复方案:
本地开发时关闭secure,生产环境再开启,用环境变量区分最方便:
app.use(session({ cookieName: 'session', secret: 'secret', duration: 30 * 60 * 1000, activeDuration: 5 * 60 * 1000, httpOnly: true, secure: process.env.NODE_ENV === 'production', // 仅生产环境启用HTTPS安全cookie ephemeral: true }));
2. 修复 requireLogin 的逻辑漏洞
你的登录校验函数直接访问 req.session.isAdmin,完全没判断 req.session 是否存在。当session不存在时,自然会抛出“无法读取undefined属性”的错误:
function requireLogin(req, res, next){ // 先检查session是否存在,再判断权限 if(!req.session || !req.session.isAdmin){ res.redirect('/Leaderboards'); }else{ next(); } });
3. 修正 /AdminRequest 中覆盖session的错误
在登录接口里,你直接把 req.session 替换成了自定义对象 newSesh,这会破坏 client-sessions 维护的session结构——它需要保持自身的对象格式才能正常工作。正确的做法是给现有session添加属性,而非直接替换:
router.post('/AdminRequest', function(req, res){ var pass = req.body.pass if(pass == "password"){ // 不要替换req.session,而是给它赋值属性 req.session.name = 'Admin'; req.session.isAdmin = true; res.send("1"); }else{ res.send("0"); } });
4. 优化用户信息挂载的中间件逻辑
你当前的中间件逻辑有点冗余,还可能漏掉session存在但无user属性的情况,建议调整成更简洁的写法:
app.use(function(req, res, next){ // 只要session存在,就把它挂载到req.user和视图变量里 if(req.session){ req.user = req.session; res.locals.user = req.session; } next(); // 无论session是否存在,都要执行后续中间件 });
总结
最可能触发错误的原因是 secure: true 在HTTP环境下导致session cookie无法被设置,再加上校验函数没判断session是否存在。先调整secure配置,再修复逻辑漏洞,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Cory Sparks

