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
相关产品推荐
相关产品推荐

