我正在使用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响应。我错过了什么?
谢谢!
ValidationPipe
不适用于基元类型(字符串、布尔值、数字(,因此您需要在@Param()
装饰器上使用ParseIntPipe
或类似的东西,以确保您得到相同类型的逻辑。可能发生的情况是,您的服务中有一些东西正在等待一个数字,但它得到了一个字符串,并且不知道如何从那里处理它。
选项是为URL参数创建一个DTO,如
export class ControllerRouteParamDto {
@Transform(({ value }) => Number.parseInt(value, 10))
@IsNumber()
id: number;
}
@Transform()
是必要的,因为url和查询参数是以字符串形式输入的,而不是它们的相关类型。