javascript - Er det mulig å sette standardverdier for en DTO?


Finnes det en måte å bruke standardverdier når en spørring er tom?

Hvis jeg har følgende DTO for en spørring:

export class MyQuery {
  readonly myQueryItem: string;
}

Og min forespørsel inneholder ingen spørring, da vil myQuery.myQueryItem være udefinert. Hvordan kan jeg gjøre det slik at det har en standardverdi?

Svar #1

Du kan sette standard direkte i DTO-klassen din:

export class MyQuery {
  readonly myQueryItem = 'mydefault';
}

Du må instansiere klassen slik at standardverdien brukes. Til det kan du for eksempel bruke ValidationPipe med alternativet transform: true. Hvis verdien settes av dine spørringsparametere, vil den bli overstyrt.

@Get()
@UsePipes(new ValidationPipe({ transform: true }))
getHello(@Query() query: MyQuery) {
  return query;
}

Hvorfor fungerer dette?

1) Pipers brukes på alle dine dekoratører, for eksempel @Body(), @Param(), @Query() og kan transformere verdiene (for eksempel ParseIntPipe) eller utføre sjekker (for eksempel ValidationPipe).

2) ValidationPipe bruker internt class-validator og class-transformer for validering. For å kunne utføre validering på inngangen din (vanlige JavaScript-objekter) må den først transformere dem til din annoterte DTO-klasse, noe som betyr at den oppretter en instans av klassen din. Med innstillingen transform: true vil den automatisk opprette en instans av DTO-klassen din.

Eksempel (i hovedsak hvordan det fungerer):

class Person {
  firstname: string;
  lastname?: string = 'May';

  constructor(person) {
    Object.assign(this, person);
  }
}

// You can use Person as a type for a plain object -> no default value
const personInput: Person = { firstname: 'Yuna' };

// When an actual instance of the class is created, it uses the default value
const personInstance: Person = new Person(personInput);

Relaterte artikler