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 -S

Allt annat borde vara bra.

Relaterade artiklar