n次请求成功后Prisma Client变为undefined问题排查求助
核心诱因结论
你提到的「rawQuery服务直接导入全局Prisma实例复用、同时resolver使用上下文独立Prisma实例」的混用方式,是触发本次错误的高概率核心原因。
Prisma 3.x版本的客户端实例存在连接池状态、模型元数据缓存的底层共享逻辑,若全局实例执行$queryRaw时触发未捕获的底层异常,会直接污染元数据缓存,导致所有关联实例的模型调用丢失tableName元数据,就会出现你观测到的报错。你提到的「同一个resolver内打印实例正常、后续调用报错」,本质是异常仅销毁了元数据缓存,实例本身的对象结构未被直接清空,所以打印输出无异常,只有调用prisma.[表名].[操作]读取元数据时才会触发错误。
排查验证步骤
- 先将rawQuery服务中所有直接导入的全局Prisma实例,统一替换为从Apollo上下文传递的实例,保证单个请求链路内仅使用同一个Prisma实例,测试验证错误是否复现
- 若替换后错误消失,可给原全局Prisma实例添加
$on('error')事件监听,输出全量错误栈,定位特定rawQuery执行时触发的底层驱动异常 - 检查该rawQuery的输入参数,是否包含BigInt、Buffer等特殊类型,3.5.0版本的
$queryRaw对特殊类型的序列化存在已知bug,会触发元数据缓存异常
解决方案
- 统一实例创建规则:生产环境采用单例模式创建唯一Prisma实例,上下文直接返回该单例即可,不需要每个请求新建独立实例,从根源避免多实例状态冲突
- 给所有
$queryRaw、$executeRaw调用添加try/catch包裹,捕获异常后主动调用prisma.$disconnect()重置实例状态,避免错误扩散到后续请求 - 升级Prisma相关依赖到3.15.x以上的3.x稳定版,3.5.0属于早期迭代版本,官方已修复多个rawQuery触发的元数据丢失、实例状态异常的已知问题
内容的提问来源于stack exchange,提问作者Phobos
相关产品推荐
相关产品推荐

