You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:33:04