You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:53:34