Jade模板渲染后变量使用问题:登录后无法显示用户名
问题分析与解决步骤
核心问题
- req.body仅存在于POST请求:首页是GET请求,
req.body.username自然为空,模板里直接调用肯定显示不了内容。 - 未正确传递/存储用户信息:登录成功后没有把用户信息持久化到session或其他可被GET请求获取的地方,首页路由也没从正确位置读取用户数据。
- 模板变量使用错误:模板里没使用路由传递的变量,反而直接访问请求对象的属性,不符合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
相关产品推荐
相关产品推荐

