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

Jade模板渲染后变量使用问题:登录后无法显示用户名

问题分析与解决步骤

核心问题

  1. req.body仅存在于POST请求:首页是GET请求,req.body.username自然为空,模板里直接调用肯定显示不了内容。
  2. 未正确传递/存储用户信息:登录成功后没有把用户信息持久化到session或其他可被GET请求获取的地方,首页路由也没从正确位置读取用户数据。
  3. 模板变量使用错误:模板里没使用路由传递的变量,反而直接访问请求对象的属性,不符合Jade模板的使用逻辑。

解决方案(推荐Session方式)

步骤1:配置express-session

先确保安装express-session,并在项目入口文件(如app.js)中配置:

const session = require('express-session');
app.use(session({
  secret: 'your-custom-secret-key', // 替换为你的密钥
  resave: false,
  saveUninitialized: false,
  cookie: { secure: false } // 开发环境用false,生产环境建议配合HTTPS设为true
}));

步骤2:登录成功后将用户信息存入Session

修改登录控制器代码,在验证通过后把用户信息写入session:

const login = (req, res, next) => {
    var username = req.body.username
    var password = req.body.password

    User.findOne({$or: [{username:username}, {email:username}]})
    .then(user => {
        if(user) {
            bcrypt.compare(password, user.password, function(err, result) {
                if(err) {
                    res.json({ error: err })
                }

                if(result) {
                    // 登录成功,存储用户信息到session
                    req.session.user = { username: user.username, name: user.name };
                    // JWT可保留用于后续API验证,前端页面用session即可
                    let token = jwt.sign({name: user.name}, 'verySecretValue', {expiresIn: '1h'})
                    res.redirect('/')
                } else {
                    res.json({ message: 'Password does not match!' })
                }
            })
        } else {
            res.json({ message: 'No user found!' })
        }
    })
}

步骤3:首页路由读取Session数据并传给模板

修改首页路由,从session中获取用户信息,传递给模板:

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');

/* GET home page. */
router.get('/', function(req, res, next) {
    // 从session取用户信息,无则设为空对象
    const user = req.session.user || {};
    res.render('index', { 
        title: 'Portfolio', 
        username: user.username // 将用户名传给模板
    });
}); 

module.exports = router;

步骤4:修改Jade模板使用传递的变量

调整index.jade中的链接部分,使用路由传递的username变量:

extends layout

block content
  body
    // Topbar Start
    .container-fluid
      .row.bg-secondary.py-2.px-xl-5
        .col-lg-6.d-none.d-lg-block
          .d-inline-flex.align-items-center
            if username
              a.text-dark(href='') #{username}
            else
              a.text-dark(href='/login') 登录
            span.text-muted.px-2 |
            a.text-dark(href='') Help
            span.text-muted.px-2 |
            a.text-dark(href='') Support

补充说明

  • 如果想用JWT方式,需将生成的token存入cookie,首页路由读取cookie并解析JWT获取用户信息,但session方式对服务端渲染页面更简单直接。
  • 生产环境需注意session的过期时间配置,以及cookie的安全设置(如httpOnly: true、secure: true)。

内容的提问来源于stack exchange,提问作者fowwest74

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:25:17