首页 > 解决方案 > 在 Nestjs 中使用自动转换验证时获得 500

问题描述

我正在使用 NestJS,我正在尝试让参数自动转换工作。我已经添加了该代码:

app.useGlobalPipes(
  new ValidationPipe({
    transform: true,
  }),
);

我有一个接收数字参数的控制器:

@Get(':id')
getStuff(@Param('id') id: number) {
  ...
}

问题是当我尝试使用非数字参数(path/to/controller/one而不是path/to/controller/1)时,我收到 500 Internal Server 错误而不是预期的 400 响应。我错过了什么?

谢谢!

标签: nestjs

解决方案


ValidationPipe不适用于原始类型(字符串、布尔值、数字),因此您需要在装饰器上使用或类似的东西ParseIntPipe@Param()以确保您获得应用相同类型的逻辑。可能发生的事情是您的服务中的某些东西需要一个数字并且它正在获取一个字符串,并且不知道如何从那里处理它。

选项是为 URL 参数创建一个 DTO,如下所示

export class ControllerRouteParamDto {
  @Transform(({ value }) => Number.parseInt(value, 10))
  @IsNumber()
  id: number;
}

@Transform()是必要的,因为 url 和查询参数以字符串形式出现,而不是它们的相关类型。


推荐阅读