Prisma $transaction回调参数传入什么类型可获得模型类型检查和自动补全
Prisma $transaction 交互式事务类型解决方案
报错原因
你传入回调函数给$transaction时触发了类型报错,是因为当前Prisma未启用交互式事务支持,Prisma默认把传入的参数识别为待执行的PrismaPromise数组,因此报出缺少数组原生方法的错误。
修复步骤
步骤1:开启交互式事务支持(按需执行)
- Prisma 4.7及以上版本:交互式事务已正式稳定,无需额外配置,直接可用
- Prisma 4.2 ~ 4.6版本:在
schema.prisma文件中添加预览功能声明,随后执行prisma generate重新生成类型:
generator client { provider = "prisma-client-js" previewFeatures = ["interactiveTransactions"] }
- 低于4.2的版本:建议升级到最新稳定版,否则不支持回调形式的交互式事务,只能使用数组式事务。
步骤2:替换正确的参数类型
事务回调中的上下文客户端类型不是普通PrismaClient,应该使用Prisma自动生成的Prisma.TransactionClient类型,同时注意在回调末尾返回你需要的user变量,避免外层拿到空值。
修改后的完整代码
import { PrismaClient, Prisma } from '@prisma/client' const prisma = new PrismaClient() export default async function SignUp(data: SIGNUP_INTERFACE) { try { let user = await prisma.$transaction(async (prisma: Prisma.TransactionClient) => { let encrypted_password = await bcrypt.hash(data.password, 10); // 1. 新增用户到数据库 const user = await prisma.user.create({ data: { username: data.username, password: encrypted_password, }, }); // 2. 新增邮箱/手机号到数据库 if (data.phoneNumber) { await prisma.user_phone.create({ data: { phone_number: data.phoneNumber, user_id: user.id }, }); } if (data.email) { await prisma.user_email.create({ data: { email: data.email, user_id: user.id }, }); } // 新增返回语句,否则外层user为undefined return user }); return user; } catch (err: any) { throw new CustomError(err.message); } }
效果验证
修改完成后,回调内的prisma实例会自动补全所有已定义的模型方法,CRUD操作的入参、返回值都有完整的类型检查,无需额外定义泛型。
内容的提问来源于stack exchange,提问作者Ankush Verma
相关产品推荐
相关产品推荐

