Express中如何将bg-login路由的数据传递至dashboard路由?
解决Express路由间用户数据传递问题
原代码的核心问题
- 全局变量的并发风险:用
global.user存储登录用户信息,多用户同时登录时会互相覆盖,且重定向后的新请求无法保证拿到正确数据。 - 对象拼接的显示问题:
res.send('Hello ' + user)会把对象转为默认字符串[object Object],需显式提取属性或转为JSON。 - 文件读取逻辑错误:原代码根据邮箱生成了用户文件路径,但实际读取的是固定的
1.json,会导致读取错误的用户数据。
正确解决方案:使用Session存储用户信息
Session是Express处理登录状态的标准方案,能在不同请求间安全存储用户上下文数据。
步骤1:安装并配置express-session
先安装依赖:
npm install express-session
在Express应用中配置session:
const express = require('express'); const session = require('express-session'); const app = express(); // 配置session app.use(session({ secret: 'your-custom-secret-key', // 替换为自己的加密密钥 resave: false, saveUninitialized: false, cookie: { secure: false } // 生产环境建议设为true(需HTTPS) })); // 解析请求体,否则req.body无法获取表单数据 app.use(express.urlencoded({ extended: true })); app.use(express.json());
步骤2:修改登录路由,将用户信息存入Session
修正文件读取逻辑,把用户信息存入req.session:
app.post('/bg-login', (req, res) => { const email1 = req.body.email; const path = `./Databases/User/${email1}.json`; if (fs.existsSync(path)) { try { // 读取当前用户对应的文件,而非固定的1.json const userData = fs.readFileSync(path); const user = JSON.parse(userData); if (user.password === req.body.password) { // 存入session时建议排除密码字段,提升安全性 req.session.user = { email: user.email }; console.log(`登录成功:${user.email}`); return res.redirect('/dashboard'); } else { return res.redirect('/login-e2'); // 密码错误 } } catch (err) { console.error('读取用户文件失败:', err); return res.redirect('/login-e1'); } } else { return res.redirect('/login-e1'); // 用户不存在 } });
步骤3:在Dashboard路由从Session读取数据
同时处理未登录的情况,避免undefined错误:
app.get('/dashboard', (req, res) => { // 检查session中是否有用户信息,未登录则跳回登录页 if (!req.session.user) { return res.redirect('/login'); } // 提取用户属性显示,或用JSON.stringify展示完整对象 res.send(`Hello ${req.session.user.email}`); // 若需展示完整用户对象:res.send(`Hello ${JSON.stringify(req.session.user)}`); });
为什么不推荐全局变量?
- 并发场景下全局变量会被不同请求覆盖,导致用户看到不属于自己的数据。
- 全局变量无法区分不同用户的请求上下文,完全不符合HTTP无状态协议的处理逻辑。
内容的提问来源于stack exchange,提问作者GoodMC
相关产品推荐
相关产品推荐

