Validation des Données
Fastify est extrêmement rapide pour la validation car il utilise JSON Schema. my-fastify-decorators te donne accès à cette puissance native via des décorateurs.
Cette page documente la validation Native (JSON Schema).
Si tu préfères utiliser des Classes et des Décorateurs (ex: @IsString(), @IsEmail()) sur tes DTOs, nous avons créé un package dédié pour ça.
👉 Va voir la documentation de my-class-validator.
Validation Native (Raw Schema)
Si tu veux définir tes schémas manuellement (ou si tu les as déjà en JSON), utilise ces décorateurs. Fastify validera la requête avant même qu'elle n'atteigne ton code. Si c'est invalide, une erreur 400 est renvoyée automatiquement.
@BodySchema(schema)
Valide le corps de la requête.
const UserJsonSchema = {
type: 'object',
required: ['email', 'password'],
properties: {
email: { type: 'string', format: 'email' },
password: { type: 'string', minLength: 8 }
}
};
@Post()
@BodySchema(UserJsonSchema)
create(@Body() data: any) {
// Ici, on est SÛR à 100% que data respecte le schéma
}
Autres décorateurs de validation
@QuerySchema(schema): Valide les paramètres d'URL (Query String).@ParamsSchema(schema): Valide les paramètres de route dynamique.@HeadersSchema(schema): Valide les en-têtes.
@ResponseSchema(status, schema) (Sérialisation)
Celui-ci est différent : il sert à formater la sortie. Fastify va utiliser ce schéma pour sérialiser ton objet de retour beaucoup plus vite que JSON.stringify(). Il filtre aussi les champs sensibles (si tu ne les mets pas dans le schéma, ils ne sont pas renvoyés).
const UserResponse = {
type: 'object',
properties: {
username: { type: 'string' },
// Pas de password ici -> il sera automatiquement retiré de la réponse !
}
};
@Get()
@ResponseSchema(200, UserResponse)
getUser() {
return { username: 'Bob', password: 'secret-password' };
// Le client recevra uniquement : { "username": "Bob" }
}
@Schema(fullSchema)
Si tu veux tout définir d'un coup (body, querystring, params, response) dans un seul objet, comme dans la doc officielle de Fastify.
@Get()
@Schema({
querystring: { ... },
response: { 200: { ... } }
})
handler() { ... }