我在尝试使用 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.
@Put('/:id')
editUser(@Param('id', ParseIntPipe) id: number, @Body() dto: EditUserDto) {
return this.userService.editUser(id, dto);
}
Nestjs 是一种类型定义语言。当从客户端接收数据时,必须指定其类型。虽然 patch 可以用于更新操作,但我相信 put 会是一个更好的解决方案,这里我通过路径参数获取 id 值。如果您进行这样的更新,您的问题就会消失。在这里,使用 getuser 装饰器,您不能仅仅指望通过拉取所有用户值来获取 id。
我今天在 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);
}