Express.js中Promise内res.redirect()无法生效的问题咨询
问题:Express登录后
res.redirect('/dashboard')不生效,控制台session数据正常 核心原因:Dashboard路由的session判断字段不匹配
你在登录POST路由中给session设置的是userId、userName、userEmail三个字段,但在Dashboard的GET路由里,判断用户是否登录的条件是req.session.user是否存在——这个字段你根本没设置过!
所以当登录成功执行res.redirect('/dashboard')后,Dashboard路由会因为req.session.user不存在,立刻执行res.redirect('/login')把用户跳回登录页,看起来就像是登录后的重定向没生效,实际上是被Dashboard路由的逻辑给拦截跳转了。
修复方案(二选一即可)
方案1:修改登录路由的session设置
直接设置req.session.user对象,和Dashboard路由的判断逻辑匹配:
// POST Login route route.post('/login', (req, res) => { users.getUserInfo(req.body.email, req.body.password) .then(userDetails => { // 统一设置req.session.user对象 req.session.user = { id: userDetails.id, name: userDetails.name, email: userDetails.email }; console.log(req.session); res.redirect('/dashboard'); }) .catch(err => { // 替换res.end,跳回登录页并传递错误信息 res.redirect(`/login?error=${encodeURIComponent(err)}`); }) });
方案2:修改Dashboard路由的判断逻辑
检查你实际在session中设置的字段(比如userId):
// Dashboard route route.get('/dashboard', (req, res) => { // 检查已存在的session字段 if (req.session.userId) res.render('dashboard', { title: "Dashboard", user: { id: req.session.userId, name: req.session.userName, email: req.session.userEmail } }); else res.redirect('/login'); });
额外建议:修复两个潜在问题
虽然这两个问题不是本次重定向失效的直接原因,但会导致其他异常,建议一并修复:
1. 修复getUserInfo的Promise逻辑错误
当前代码中,forEach遍历用户时,即使匹配到用户执行了resolve,循环仍会继续,且最后一定会执行reject(虽然Promise状态不会改变,但逻辑冗余且易出问题)。另外你还拼写错了Password为Passoword。
修改为用find方法查找用户,逻辑更清晰:
const fs = require('fs'); // Get user information exports.getUserInfo = (email, password) => { return new Promise((resolve, reject) => { fs.readFile('./users.json', (err, data) => { if (err) reject(err); const users = JSON.parse(data); // 用find快速定位匹配的用户 const matchedUser = users.find(user => email === user.email && password === user.password ); if (matchedUser) { resolve({ id: matchedUser._id, name: matchedUser.name, email: matchedUser.email }); } else { reject("Incorrect Email or Password"); // 修正拼写错误 } }); }); }
2. 规范错误处理逻辑
登录失败时用res.end(err)会直接返回错误字符串给浏览器,用户体验极差,建议跳回登录页并通过查询参数传递错误信息,后续在登录页模板中渲染该提示。
内容的提问来源于stack exchange,提问作者Rohit Kanojiya
相关产品推荐
相关产品推荐

