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

Express Session路由切换时无法获取会话值的问题

Express Session跨路由丢失问题

在使用Express Session时遇到以下问题:/login路由中能正常读取req.session.user数据,但切换到/connect路由时,req.session.user显示为undefined,无法通过会话在路由间传递用户数据。


相关代码

后端代码

import express from 'express';
import session from 'express-session';
import userHelpers from './helpers/userHelpers.js';
import db from './config/connection.js';
import cors from 'cors';
import cookieParser from 'cookie-parser';
import morgan from 'morgan';
import MongoStore from 'connect-mongo';

const app = express();

// Middleware
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cors());
app.use(cookieParser());
app.use(morgan("dev"));

// Session configuration
app.use(session({
    secret: "Key",
    saveUninitialized: true,
    resave: false,
    store: new MongoStore({ mongoUrl: 'mongodb://127.0.0.1:27017/connect-app' }),
    cookie: { maxAge: 6000000 }
}));

// Connect to the database
db.connect((err) => {
    if (err) {
        console.log("Error in connection");
    } else {
        console.log("Connected to database");
    }
});

// Routes

app.post('/signup', async (req, res) => {
    const data = req.body;
    await userHelpers.signupUser(data).then((info) => {
        console.log("User created:", info);
        res.json({ valid: true });
    });
});

app.post('/login', (req, res) => {
    const data = req.body;
    userHelpers.loginUser(data).then((info) => {
        if (info) {
            req.session.user = { info };
            req.session.save();
            console.log("Login session :", req.session.user);
            res.json({ valid: true, userInfo: { info } });
        } else {
            console.log("User not found");
            res.json({ valid: false });
        }
    }).catch((err) => {
        console.log("Error:", err);
        res.json({ valid: false });
    });
});

app.get('/connect', async (req, res) => {
    console.log("Connect session:", req.session.user);
    if (req.session.user) {
        const user = req.session.user;
        console.log("USER:", user);
        return res.json({ valid: true, userInfo: user.info.email });
    } else {
        return res.json({ valid: false });
    }
});

// Start the server
app.listen(3001, () => {
    console.log('Server is running');
});

前端/login路由代码

const HandleClick = (e) => {
        e.preventDefault()
        axios.post('http://localhost:3001/login', { email, password }, {withCredentials:true, credentials: 'include'}).then((result) => {
            if(result.data.valid)
                navigate('/connect')
            else
                navigate('/login')
        }).catch((err) => {
            console.log(err)
        })
    }

前端/connect路由代码

useEffect(()=>{
        axios.get('http://localhost:3001/connect').then((response)=>{
            console.log(response.data)
        })
    })

问题排查与解决

1. 补全CORS凭证支持配置

后端默认的cors()中间件未开启允许携带凭证,导致前端请求无法传递session cookie。修改CORS配置:

app.use(cors({
    origin: 'http://localhost:3000', // 替换为你的前端实际域名
    credentials: true // 允许请求携带凭证
}));

2. 前端GET请求添加凭证配置

/connect路由的GET请求未设置withCredentials: true,导致session cookie无法发送到后端。修改前端代码:

useEffect(()=>{
        axios.get('http://localhost:3001/connect', { withCredentials: true }).then((response)=>{
            console.log(response.data)
        })
    }, []) // 添加空依赖数组,避免组件重复渲染时重复发送请求

3. 优化Session保存的异步处理

当前req.session.save()调用后直接返回响应,可能存在会话未完成持久化就跳转的情况。修改登录路由代码,确保会话保存完成后再返回:

app.post('/login', (req, res) => {
    const data = req.body;
    userHelpers.loginUser(data).then((info) => {
        if (info) {
            req.session.user = { info };
            req.session.save((err) => {
                if (err) {
                    console.log("Session save error:", err);
                    return res.json({ valid: false });
                }
                console.log("Login session :", req.session.user);
                res.json({ valid: true, userInfo: { info } });
            });
        } else {
            console.log("User not found");
            res.json({ valid: false });
        }
    }).catch((err) => {
        console.log("Error:", err);
        res.json({ valid: false });
    });
});

4. 可选:配置Session Cookie的SameSite属性

如果浏览器默认SameSite策略导致cookie跨域传递失败,可在session配置中显式设置:

app.use(session({
    secret: "Key",
    saveUninitialized: true,
    resave: false,
    store: new MongoStore({ mongoUrl: 'mongodb://127.0.0.1:27017/connect-app' }),
    cookie: { 
        maxAge: 6000000,
        sameSite: 'none', // 跨域场景下设置为none
        secure: process.env.NODE_ENV === 'production' // 生产环境需开启secure(仅HTTPS生效)
    }
}));

内容的提问来源于stack exchange,提问作者GayalMelappilly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:38:20