Node.js Express使用prisma-session-store报data字段值过长错误
问题产生原因
报错核心原因是Prisma Schema中定义的会话表data字段类型长度不足,无法存储序列化后的完整会话数据。@quixo3/prisma-session-store运行时会将req.session上挂载的所有内容序列化为JSON字符串,写入会话表的data列。如果建表时将该字段设为普通短字符串类型(例如MySQL默认的VARCHAR(255)),只要会话中存储了用户信息、权限标识、临时提示消息等稍大的内容,就会触发长度超限报错。给出的Express session配置本身没有逻辑问题,Prisma独立运行正常也排除了客户端连接故障。
解决步骤
- 修改Prisma Schema文件(路径通常为
prisma/schema.prisma)中的Session模型,将data字段替换为无长度限制/大长度的文本类型,不同数据库对应写法如下:
- MySQL/MariaDB:字段追加
@db.Text(最大64KB)或@db.LongText(最大4GB,推荐) - PostgreSQL:直接使用
String即可(PG的Text类型无长度限制,也可显式标记@db.Text) - SQLite:原生String类型无长度限制,无需额外调整
标准的Session模型参考写法:
如果初始化model Session { id String @id sid String @unique data String @db.LongText // 替换原短字符串类型定义 expiresAt DateTime }PrismaSessionStore时自定义了sessionModelName参数,请将上述模型名替换为自定义的名称。- 修改Prisma Schema文件(路径通常为
- 保存Schema修改后,执行迁移命令同步变更到数据库:
开发环境执行:
生产环境请使用对应环境的迁移发布命令同步表结构,避免直接操作线上表导致数据丢失。npx prisma migrate dev --name expand_session_data_column- 保存Schema修改后,执行迁移命令同步变更到数据库:
- 3.(可选优化)排查业务代码,避免将大体积对象(例如全量用户信息、完整权限树、大段缓存数据)直接挂载到
req.session下,仅存储必要的索引字段(例如用户ID),需要完整数据时再通过ID查库获取,从根源上降低会话存储的体积。
内容的提问来源于stack exchange,提问作者mercury
相关产品推荐
相关产品推荐

