登录用户名称跨页显示异常:用户页报错,求修复方案
问题:用户页面无法显示已登录用户名称,管理员页面正常
我需要在EJS页面展示已登录用户的名称,目前管理员页面可正常实现该功能,但用户页面执行相同操作时出现报错,无法正常显示。不清楚报错原因,希望获得修复方案。
现有代码
admin.js
router.get('/adminform', function (req, res, next) { var username = req.session.username; var name = req.session.name; res.render('adminform', { title: 'adminform', username: username, name: name}); });
user.js
router.get('/userform', function (req, res, next) { var username = req.session.username; var name = req.session.name; res.render('userform', { title: 'userform', username: username, name: name}); });
login.js
router.post('/auth', function(request, response) { var username = request.body.username; var password = request.body.password; if (username && password) { connection.query('SELECT * FROM member WHERE username = ? AND password = ?', [username, password], function(error, results, fields) { if (results.length > 0) { request.session.loggedin = true; request.session.username = username; var user = results[0]; request.session.name = user.name; results.map(val =>{ console.log(val.role); if(val.role == 0){ console.log("admin"); response.redirect('/admin/adminform'); } if(val.role == 1){ console.log("member"); response.redirect('/user/userform'); }
页面EJS代码
<h2> Welcome <%= username %> </h2>
问题分析与修复方案
核心问题:重复调用response.redirect
login.js里使用results.map()遍历查询结果,而按用户名+密码查询应该只会返回一条用户数据,map循环会导致response.redirect被多次执行,触发Cannot set headers after they are sent to the client错误,这会导致用户登录后的session未正确初始化,进而用户页面无法获取session中的username值。修复步骤
移除多余的
results.map(),直接从results[0]获取用户角色:
修改login.js的登录逻辑:router.post('/auth', function(request, response) { var username = request.body.username; var password = request.body.password; if (username && password) { connection.query('SELECT * FROM member WHERE username = ? AND password = ?', [username, password], function(error, results, fields) { if (error) throw error; // 新增错误处理 if (results.length > 0) { request.session.loggedin = true; request.session.username = username; var user = results[0]; request.session.name = user.name; console.log(user.role); if(user.role == 0){ console.log("admin"); response.redirect('/admin/adminform'); } else if(user.role == 1){ // 使用else if避免重复判断 console.log("member"); response.redirect('/user/userform'); } } else { // 新增:无匹配用户的处理逻辑 response.send('用户名或密码错误'); } }); } else { // 新增:未输入用户名/密码的处理逻辑 response.send('请输入用户名和密码'); } });验证session中间件配置
确保你的Express应用已正确配置session中间件(比如使用express-session),且该中间件在所有路由之前加载,否则user路由无法读取session数据:const session = require('express-session'); app.use(session({ secret: 'your-secret-key', // 替换为你的密钥 resave: false, saveUninitialized: true }));用户页面EJS容错处理
为避免因session未初始化导致的报错,可以在EJS中添加判断:<h2> Welcome <%= username || 'Guest' %> </h2>
内容的提问来源于stack exchange,提问作者Nineny Socute
相关产品推荐
相关产品推荐

