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

NestJS Prisma更新Invitation时实体属性类型不兼容报错如何解决

报错根因
  • Prisma 约定关系字段和对应的外键字段不能同时传入更新参数,你当前的代码同时传入了work(关系字段)和workId(外键字段),触发了Prisma的类型校验,所以报workId类型为never的错误
  • 你的领域层Invitation类的work字段为string类型,和Prisma生成的Invitation实体的work关联对象类型不匹配
  • 更新操作时传入了id、createdAt等不可修改的系统字段,也会触发类型校验失败
修复步骤

1. 调整更新方法的入参过滤

更新update方法,解构过滤掉不需要传给Prisma的字段,不要同时传work和workId,也不要手动设置work: undefined:

async update(invitation: Invitation): Promise<Invitation> {
  // 过滤掉id、关联对象work、创建时间等不可更新的字段
  const { id, work, createdAt, ...updatePayload } = invitation;
  const entity = await this.prismaService.invitation.update({
    where: {
      id: invitation.id,
    },
    data: {
      ...updatePayload,
      status: RequestStatusEntity[invitation.status],
    },
    include: {
      work: true,
    },
  });

  return this.toDomain(entity);
}

2. 修正关联字段的映射逻辑

修改toDomain方法,把Prisma返回的Work关联对象转成领域层Invitation类需要的string类型(示例默认取work的id,可根据业务调整为其他字段):

private toDomain(
  entity: InvitationEntity & {
    work: WorkEntity;
  },
): Invitation {
  return Object.setPrototypeOf(
    {
      ...entity,
      // 新增这行,把关联对象转成领域层需要的字符串
      work: entity.work.id,
      status: RequestStatus[entity.status],
    },
    Invitation.prototype,
  );
}

3. 对齐Prisma模型和领域类的可选属性

你当前Prisma模型中co、owner、note、respondedAt都是必填字段,但你的领域层Invitation类里这几个字段标记为可选,如果业务上确实允许为空,需要把Prisma模型对应字段加上?标记为可选,避免后续类型冲突:

model Invitation {
  id              String        @id @db.Uuid
  workId          String        @db.Uuid
  work            Work          @relation(...)
  status          RequestStatus
  co              String?        @db.Uuid
  owner           String?
  note            String?  
  createdAt       DateTime
  respondedAt     DateTime?  
}

修改后重新执行prisma generate生成最新的类型定义即可。

内容的提问来源于stack exchange,提问作者Vakindu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:54:04