typescript - numerisk parametervalidering misslyckas trots att kraven borde uppfyllas
Jag vill hämta en plats efter koordinater. Jag började med en enkel DTO
export class GetLocationByCoordinatesDTO {
@IsNumber()
@Min(-90)
@Max(90)
public latitude: number;
@IsNumber()
@Min(-180)
@Max(180)
public longitude: number;
}
och denna API-slutpunkt
@Get(':latitude/:longitude')
public getLocationByCoordinates(@Param() { latitude, longitude }: GetLocationByCoordinatesDTO): Promise<Location> {
// ...
}
För att testa denna slutpunkt ringer jag denna URL
localhost:3000/locations/0/0
och tyvärr får jag följande svar
{
"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"
}
Vet någon hur man fixar detta? Jag skulle förvänta mig att det går igenom.
Det verkar som att URL-parametrarna betraktas som strängar, men hur kan jag då tolka dem till siffror?
Svar #1
Detta är ett välkänt problem, mer kan du hitta på GitHub-issue.
Lösningen på ditt problem skulle vara att uttryckligen typsätta Number-typen i DTO så här:
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;
}
Du behöver installera class-transformer om du vill att detta ska fungera:
npm i class-transformer -SAllt annat borde vara bra.
