Prisma $transaction中update调用因返回类型不兼容报错求助
解决Prisma事务中PrismaPromise与普通Promise的类型不兼容问题
问题根源
Prisma的$transaction方法要求传入的数组元素必须是**PrismaPromise类型**,但你的DAO层方法因为添加了async关键字,自动将Prisma查询返回的PrismaPromise包装成了普通Promise,导致类型不匹配,触发报错。
解决方案1:移除DAO层方法的async关键字
Prisma的查询方法(如deleteMany、createMany、update)本身返回的就是兼容Promise的PrismaPromise,无需用async包装。直接返回查询结果即可满足$transaction的类型要求。
修改后的DAO层代码:
PurchaseItemDao.ts
const deletePurchaseItemsByPurchaseId = (purchaseId) => { return prisma.purchaseItem.deleteMany({ where: { purchaseId: purchaseId } }) } const insertPurchaseItems = (purchaseItems) => { return prisma.purchaseItem.createMany({data: purchaseItems}) }
PurchaseDao.ts
const updatePurchase = (purchase) => { return prisma.purchase.update({ where: { purchaseId: purchase.purchaseId }, data: { globalDiscount: purchase.globalDiscount, Storage: { connect: {storageId: purchase.storageId} }, Supplier: { connect: {supplierId: purchase.supplierId} }, orgId: purchase.orgId } }) }
服务层的savePurchase方法无需修改,$transaction会自动处理这些PrismaPromise的批量执行。
解决方案2:使用事务回调函数形式
如果你的DAO层需要执行额外异步逻辑(比如预处理数据),可以改用Prisma事务的回调函数模式。这种模式允许在事务内部使用await,且无需修改DAO层的async定义(只需将事务客户端tx传入DAO方法)。
修改后的服务层代码:
const savePurchase = async (purchase) => { await prisma.$transaction(async (tx) => { // 传入tx作为参数给DAO方法,确保操作在同一事务上下文执行 await deletePurchaseItemsByPurchaseId(tx, purchase.purchaseId); await insertPurchaseItems(tx, purchase.purchaseItems); await updatePurchase(tx, purchase); }) }
对应的DAO层方法调整:
// PurchaseItemDao.ts const deletePurchaseItemsByPurchaseId = async (tx, purchaseId) => { return tx.purchaseItem.deleteMany({ where: { purchaseId: purchaseId } }) } const insertPurchaseItems = async (tx, purchaseItems) => { return tx.purchaseItem.createMany({data: purchaseItems}) } // PurchaseDao.ts const updatePurchase = async (tx, purchase) => { return tx.purchase.update({ where: { purchaseId: purchase.purchaseId }, data: { globalDiscount: purchase.globalDiscount, Storage: { connect: {storageId: purchase.storageId} }, Supplier: { connect: {supplierId: purchase.supplierId} }, orgId: purchase.orgId } }) }
这种方式的优势是能灵活处理事务内的多步异步操作,且所有操作共享同一事务上下文,保证原子性。
内容的提问来源于stack exchange,提问作者Daniel Calderon Mori
相关产品推荐
相关产品推荐

