在NestJS UserService中调用this.prisma.user.update()时出错

问题描述 投票:0回答:2

我在尝试使用 NestJS 应用程序中的

this.prisma.user.update()
方法更新用户时遇到问题。
user.service.ts
中产生错误的代码片段如下:

@Injectable()
export class UserService {
  constructor(private prisma: PrismaService) {}

  async editUser(userId: number, dto: EditUserDto) {
  console.log(userId);
    const user = await this.prisma.user.update({
      where: {
        id: userId,
      },
      data: {
        ...dto,
      },
    });
    

    delete user.hash;

    return user;
  }
}

userId
中的
console.log
返回整个对象的 JSON 表示,而不是获取 ID 表示。

这是该实体的 Prisma 架构:

model User {
  id Int @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  email String @unique
  hash String
  firstName String?
  lastName String?

  cars Car[]

  @@map("users")
}

基本控制器:

@UseGuards(JwtGuard)
@Controller('users')
export class UserController {
  constructor(private userService: UserService) {}

  @Get('current')
  getCurrent(@GetUser('') user: User) {
    return user;
  }

  @Patch()
  editUser(@GetUser('id') userId: number, @Body() dto: EditUserDto) {
    return this.userService.editUser(userId, dto);
  }
}

日志:

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: '[email protected]',
  firstName: 'testuser',
  lastName: null
}
on prisma.updateOneUser. Provided Json, expected Int.
typescript nestjs
2个回答
0
投票
@Put('/:id')
editUser(@Param('id', ParseIntPipe) id: number, @Body() dto: EditUserDto) {
  return this.userService.editUser(id, dto);
}

Nestjs 是一种类型定义语言。当从客户端接收数据时,必须指定其类型。虽然 patch 可以用于更新操作,但我相信 put 会是一个更好的解决方案,这里我通过路径参数获取 id 值。如果您进行这样的更新,您的问题就会消失。在这里,使用 getuser 装饰器,您不能仅仅指望通过拉取所有用户值来获取 id。


0
投票

我今天在 editUser 测试中遇到了类似的问题,这是关于我传递对象和所需的整数。鉴于此,您不能仅将值传递给 editUser 服务调用。该方法需要类型为 number 的 id。我有 User (对象)类型的用户。所以我传递了您用户的 .id 属性,其中包含预期值。

//so User and Bookmark controllers gave errors this way:

// FOR THE USERS

@Patch()
editUser(
  @GetUser('id') userId: number,
  @Body() dto: EditUserDto,
) {
  return this.userService.editUser(userId, dto);
}


// FOR THE BOOKMARKS

@Get()
getBookmarks(@GetUser('id') userId: number) {
  return this.bookmarkService.getBookmarks(
    userId,
  );
} 


//FIXED THEM, THIS WAY

// FOR THE USERS

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

// FOR THE BOOKMARKS

@Get()
getBookmarks(@GetUser('id') user: User) {
  return this.bookmarkService.getBookmarks(user.id);
}
© www.soinside.com 2019 - 2024. All rights reserved.