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

NestJS调用prisma.user.update()更新用户时出现类型不匹配错误

解决NestJS中Prisma更新用户的类型不匹配问题

问题现象

调用用户更新接口时,Prisma抛出类型不匹配错误:

Argument id: Got invalid value

{
  id: 1,
  createdAt: new Date('2023-06-22T05:40:38.230Z'),
  updatedAt: new Date('2023-06-23T04:52:31.638Z'),
  email: 'test@test.com',
  firstName: 'testuser',
  lastName: null
}

on prisma.updateOneUser. Provided Json, expected Int.

同时user.service.ts中的console.log(userId)输出完整的User对象,而非预期的数字ID。

问题原因

控制器中使用的@GetUser('id')装饰器未正确提取用户对象的id属性,导致传入editUser方法的userId是整个User对象,而非数字类型的ID,与Prisma要求的Int类型不匹配。

解决方案

有两种可行的修复方式:

方式一:修复@GetUser装饰器,支持提取指定属性

如果@GetUser是你自定义的装饰器,修改其实现,使其能根据传入的参数提取用户对象的对应属性:

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const GetUser = createParamDecorator(
  (data: string | undefined, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    const user = request.user;
    return data ? user[data] : user;
  },
);

修改后,@GetUser('id')会正确返回用户的ID数值,传入service的参数类型就匹配了。

方式二:在控制器中直接获取完整用户对象,手动提取ID

修改控制器的editUser方法,先获取完整的User对象,再从中提取ID传入service:

@Patch()
editUser(@GetUser() user: User, @Body() dto: EditUserDto) {
  return this.userService.editUser(user.id, dto);
}

这种方式无需修改装饰器,直接通过user.id拿到正确的数字ID,确保传给Prisma的参数类型符合要求。

验证

修复后重新调用更新接口,console.log(userId)会输出数字ID,Prisma的user.update方法能正常执行,不再抛出类型不匹配错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:47:54