Express.js无法保存会话数据:用户ID跨会话丢失问题求助
Express会话中userId跨请求丢失问题解决
问题场景
我正在开发一个Web应用,希望为每个客户端分配一个可跨会话保留的随机用户ID,为此设置了req.session.userId变量。
服务端代码:
const app = express() app.use(session({ secret: '1234', resave: true, saveUninitialized: true, })) app.use(cors()) app.use(express.json()) app.use(express.urlencoded()) app.use(express.static("public")) app.get("/", (req, res) => { req.session.userId = "user-" + utils.generateRandomString() res.sendFile(__dirname + '/index.html') }) app.post("/api/auth", (req, res) => { console.log(req.session) // auth logic res.send("Success") })
当用户访问/路径时,userId已被设置,该ID应随后续/api/auth请求一同发送,但userId会话变量始终为undefined,控制台输出如下:
Session { cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true } }
补充的客户端代码:
fetch("/api/auth", { method: "POST", body: "" }).then(res => res.text().then(text => console.log(text)))
尝试调整会话中间件顺序(放在cors、json等之后)无效,求解决方法。
解决方法
配置CORS允许凭据传递
会话依赖Cookie标识用户,默认fetch不会发送Cookie,需两端配合修改:- 服务端:更新
cors配置,指定合法前端源并开启凭据支持(不能用*作为origin):app.use(cors({ origin: 'http://localhost:3000', // 替换为你的实际前端地址 credentials: true })) - 客户端:在
fetch请求中添加credentials: 'include',确保携带会话Cookie:fetch("/api/auth", { method: "POST", body: "", credentials: 'include' }).then(res => res.text().then(text => console.log(text)))
- 服务端:更新
修正会话初始化逻辑
当前每次访问/都会重置userId,不符合"跨会话保留"的需求,应先检查会话中是否已有ID,无则生成:app.get("/", (req, res) => { if (!req.session.userId) { req.session.userId = "user-" + utils.generateRandomString() } res.sendFile(__dirname + '/index.html') })验证会话Cookie状态
在浏览器开发者工具的Application标签下,查看是否存在名为connect.sid的Cookie,且发送/api/auth请求时,请求头包含Cookie字段。确认会话存储有效性
如果你用的是默认内存存储,注意服务重启后会话数据会清空,生产环境建议改用Redis等持久化存储方案。
内容的提问来源于stack exchange,提问作者Wais Kamal
相关产品推荐
相关产品推荐

