Node.js+EJS页面跳转时user变量未定义问题求助
问题分析
首次登录后访问/donor_dashboard时,你在登录逻辑里主动查询了userData并通过res.render传递给模板,所以能正常显示user.id;但从/donation页面跳转回/donor_dashboard时,触发的是单独的GET路由,这个路由里的res.render没有传递user变量,导致EJS模板报错user未定义。
解决方案
有两种可行的修复方式:
方式一:在dashboard的GET路由中从session获取用户数据并传递
修改/donor_dashboard的GET路由代码,从session中取出用户ID,查询完整用户数据后传给模板:
router.get("/donor_dashboard", isAuth.donorAuth, async (req, res) => { // 从session中获取用户ID const userId = req.session.user._id; // 查询用户完整数据 const userData = await register.findById(userId); // 传递user变量给模板 res.render("./donorpanel/donor_dashboard", { user: userData }); });
方式二:通过中间件全局注入用户数据(更优雅)
如果多个页面都需要用户数据,可以写一个全局中间件,在每次请求时自动把用户数据注入到模板的渲染上下文里,避免重复代码:
- 创建中间件文件(比如
middleware/userContext.js):
module.exports = async (req, res, next) => { if (req.session.isAuth && req.session.user) { const userData = await register.findById(req.session.user._id); // 把user挂载到res.locals,EJS默认会读取这个对象里的变量 res.locals.user = userData; } next(); };
- 在
app.js中注册这个中间件(需放在路由注册之前):
const userContext = require('./middleware/userContext'); app.use(userContext);
- 之后所有路由的
res.render都不用手动传user了,原dashboard路由可保持不变:
router.get("/donor_dashboard", isAuth.donorAuth, (req, res) => { res.render("./donorpanel/donor_dashboard"); });
错误原因补充
登录时的res.render主动传递了user: userData,但后续通过GET路由访问dashboard时未传递该变量,EJS模板渲染时找不到user,因此抛出user未定义的错误。
内容的提问来源于stack exchange,提问作者dmx
相关产品推荐
相关产品推荐

