使用express-session时request.session挂载时机及TS类型定义选择
结论
只要你正确在Express应用中注册了express-session中间件,request.session属性本身始终存在,不会为undefined,不管用户是否登录、是否已经创建过会话,因此你的TypeScript类型定义应该选择必选属性的写法。
详细说明
- 新用户首次访问(无有效会话Cookie)时,
express-session会自动在request上挂载一个全新的空session对象,此时你自定义的userId等字段默认为空,但session对象本身是存在的。你可以直接给这个对象赋值属性,赋值后会话才会被持久化到存储中,同时给客户端下发会话Cookie。 - 已经持有有效会话Cookie的用户访问时,
express-session会自动从存储中拉取对应会话数据,填充到request.session对象上。
TypeScript类型优化建议
你不需要给MyContext的session加可选标记,不过建议给SessionData里的自定义字段加可选标记,更符合实际运行逻辑:
import { SessionData } from "express-session"; declare module "express-session" { interface SessionData { // 未登录时userId为undefined,加可选标记更严谨 userId?: string; } } export interface MyContext { // session始终存在,设为必选 session: SessionData; }
内容的提问来源于stack exchange,提问作者Jake Giri
相关产品推荐
相关产品推荐

