Vous pouvez définir la valeur par défaut directement dans votre classe DTO :
export class MyQuery {
readonly myQueryItem = 'mydefault';
}
Vous devez instancier la classe pour que la valeur par défaut soit utilisée. Pour cela, vous pouvez par exemple utiliser la fonction ValidationPipe
avec l'option transform: true
. Si la valeur est définie par les paramètres de votre requête, elle sera remplacée.
@Get()
@UsePipes(new ValidationPipe({ transform: true }))
getHello(@Query() query: MyQuery) {
return query;
}
Pourquoi cela fonctionne-t-il ?
1) Les tuyaux sont appliqués à tous vos décorateurs, par exemple. @Body()
, @Param()
, @Query()
et peut transformer les valeurs (par ex. ParseIntPipe
) ou effectuer des contrôles (par exemple ValidationPipe
).
2) Le ValidationPipe
utilise en interne class-validator
y class-transformer
pour la validation. Pour être en mesure d'effectuer la validation de vos entrées (objets javascript simples), il doit d'abord les transformer en votre classe dto annotée, ce qui signifie qu'il crée une instance de votre classe. Avec le paramètre transform: true
il créera automatiquement une instance de votre classe dto.
Exemple (en gros, comment ça marche) :
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);