Express中重定向时向指定路由传递user对象的问题
解决重定向时传递user对象的问题
首先明确:res.locals之所以返回undefined,是因为重定向会让客户端发起全新的HTTP请求,而res.locals只绑定在当前请求的上下文里,新请求的上下文和之前的完全独立,自然取不到之前存的数据。
下面给你两个可行的解决方案:
方案1:用Session存用户数据(推荐)
如果你的项目已经配置了session(比如express-session),直接把user存在session里,目标路由再读取:
修改signup路由代码:
// 注册成功创建user后 req.session.user = newUser; // 把user对象存入session res.redirect('/lounge');
lounge路由代码:
app.get('/lounge', (req, res) => { const user = req.session.user; if (!user) { return res.redirect('/signup'); // 没拿到用户就跳回注册页 } // 这里用user做你要的操作,比如渲染页面 res.render('lounge', { user }); // 可选:用完后清除session里的user,避免后续请求误拿 delete req.session.user; });
方案2:用Cookie传递(适合数据量小的情况)
如果user数据不多,可以加密后存在cookie里(注意:敏感数据一定要加密,别明文存):
signup路由代码:
// 把user转成JSON字符串存到cookie,开启httpOnly和secure提升安全性 res.cookie('user', JSON.stringify(newUser), { httpOnly: true, secure: process.env.NODE_ENV === 'production' }); res.redirect('/lounge');
lounge路由代码:
app.get('/lounge', (req, res) => { const userCookie = req.cookies.user; if (!userCookie) { return res.redirect('/signup'); } const user = JSON.parse(userCookie); // 使用user对象处理业务 res.render('lounge', { user }); // 可选:用完清除cookie res.clearCookie('user'); });
额外提醒
- 用session的话,生产环境别用默认的内存存储,要配redis或数据库作为session存储,避免内存泄漏。
- 用cookie的话,一定要加密敏感字段,比如用户密码绝对不能存进去,
httpOnly能防止前端JS读取cookie,secure确保只在HTTPS下传输。
内容的提问来源于stack exchange,提问作者Tjsm
相关产品推荐
相关产品推荐

