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

Postman请求正常但浏览器失败:Express Session数据获取异常

问题分析与解决方案

核心现象

  • 后端/step1接口可正常将预约数据存入会话,Postman调用/step2能正常获取会话数据
  • 浏览器前端调用/step2接口返回404,提示「The session data does not exist」
  • 其他接口正常,已配置CORS中间件

1. 修复跨域请求的Cookie携带问题

浏览器跨域请求默认不会自动携带Cookie,而Postman会自动处理。需显式开启请求的凭证携带,并配置后端CORS允许凭证传递:

前端Axios请求修改

function getSessionData(bookingId) {
    return axios.get(`http://localhost:9000/api/bookings/step2?bookingId=${bookingId}`, {
        withCredentials: true // 强制携带会话Cookie
    });
}

后端CORS配置修改

注意origin不能用通配符*,必须指定前端具体域名:

const cors = require('cors');
app.use(cors({
    origin: 'http://localhost:3000', // 替换为你的前端实际运行域名
    credentials: true // 允许跨域传递凭证
}));

2. 修复useQuery的调用逻辑错误

当前useQuery的第二个参数直接执行了getSessionData(bookingId),这会导致组件挂载时立即发送请求(可能此时bookingId还未获取到),且不符合useQuery要求的「返回Promise的函数」格式:

const { data } = useQuery("sessionData", () => getSessionData(bookingId), {
    enabled: !!bookingId // 仅当bookingId存在时才触发请求
});

3. 检查Express Session的Cookie配置

确保会话Cookie的属性允许在跨域场景下被浏览器发送:

app.use(session({
    secret: 'your-custom-secret-key',
    resave: false,
    saveUninitialized: false,
    cookie: {
        secure: process.env.NODE_ENV === 'production', // 生产环境HTTPS下设为true,本地开发设为false
        sameSite: process.env.NODE_ENV === 'production' ? 'None' : 'Lax', // 生产环境用None,本地用Lax
        maxAge: 24 * 60 * 60 * 1000 // 会话有效期,按需调整
    }
}));

4. 验证会话Cookie是否被正确存储

打开浏览器开发者工具(F12),切换到Application标签,查看http://localhost:9000域名下是否存在connect.sidCookie。若不存在,说明会话Cookie未被正确设置,需重新检查上述session和CORS配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:05:25