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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:12:01