You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录用户名称跨页显示异常:用户页报错,求修复方案

问题:用户页面无法显示已登录用户名称,管理员页面正常

我需要在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>

问题分析与修复方案

  1. 核心问题:重复调用response.redirect
    login.js里使用results.map()遍历查询结果,而按用户名+密码查询应该只会返回一条用户数据,map循环会导致response.redirect被多次执行,触发Cannot set headers after they are sent to the client错误,这会导致用户登录后的session未正确初始化,进而用户页面无法获取session中的username值。

  2. 修复步骤

    • 移除多余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:53:22