数字参数验证失败,但要求应该通过
numeric parameter validation fails although requirements should pass
我想通过坐标获取位置。我从一个简单的 DTO
开始
export class GetLocationByCoordinatesDTO {
@IsNumber()
@Min(-90)
@Max(90)
public latitude: number;
@IsNumber()
@Min(-180)
@Max(180)
public longitude: number;
}
和这个 API 端点
@Get(':latitude/:longitude')
public getLocationByCoordinates(@Param() { latitude, longitude }: GetLocationByCoordinatesDTO): Promise<Location> {
// ...
}
为了测试这个端点,我称之为 url
localhost:3000/locations/0/0
不幸的是,我收到以下回复
{
"statusCode": 400,
"message": [
"latitude must not be greater than 90",
"latitude must not be less than -90",
"latitude must be a number conforming to the specified constraints",
"longitude must not be greater than 180",
"longitude must not be less than -180",
"longitude must be a number conforming to the specified constraints"
],
"error": "Bad Request"
}
有人知道如何解决这个问题吗?我希望它能通过。
似乎 url 参数被认为是字符串,但我怎样才能将它们解析为数字呢?
这是众所周知的问题,您可以在 github issue 上找到更多信息。
您的问题的解决方案是像这样在 DTO 中显式转换 Number
类型:
import { Min, Max, IsNumber } from 'class-validator';
import { Type } from 'class-transformer';
export class GetLocationByCoordinatesDTO {
@IsNumber()
@Type(() => Number)
@Min(-90)
@Max(90)
public latitude: number;
@IsNumber()
@Type(() => Number)
@Min(-180)
@Max(180)
public longitude: number;
}
如果你想让它工作,你需要安装 class-transformer
:
npm i class-transformer -S
其他都应该没问题。
我想通过坐标获取位置。我从一个简单的 DTO
开始export class GetLocationByCoordinatesDTO {
@IsNumber()
@Min(-90)
@Max(90)
public latitude: number;
@IsNumber()
@Min(-180)
@Max(180)
public longitude: number;
}
和这个 API 端点
@Get(':latitude/:longitude')
public getLocationByCoordinates(@Param() { latitude, longitude }: GetLocationByCoordinatesDTO): Promise<Location> {
// ...
}
为了测试这个端点,我称之为 url
localhost:3000/locations/0/0
不幸的是,我收到以下回复
{
"statusCode": 400,
"message": [
"latitude must not be greater than 90",
"latitude must not be less than -90",
"latitude must be a number conforming to the specified constraints",
"longitude must not be greater than 180",
"longitude must not be less than -180",
"longitude must be a number conforming to the specified constraints"
],
"error": "Bad Request"
}
有人知道如何解决这个问题吗?我希望它能通过。
似乎 url 参数被认为是字符串,但我怎样才能将它们解析为数字呢?
这是众所周知的问题,您可以在 github issue 上找到更多信息。
您的问题的解决方案是像这样在 DTO 中显式转换 Number
类型:
import { Min, Max, IsNumber } from 'class-validator';
import { Type } from 'class-transformer';
export class GetLocationByCoordinatesDTO {
@IsNumber()
@Type(() => Number)
@Min(-90)
@Max(90)
public latitude: number;
@IsNumber()
@Type(() => Number)
@Min(-180)
@Max(180)
public longitude: number;
}
如果你想让它工作,你需要安装 class-transformer
:
npm i class-transformer -S
其他都应该没问题。