Passer au contenu

Filtres d’exception

La seule différence entre le filtre d’exception HTTP et le filtre d’exception correspondant aux microservices est que, au lieu de lever une HttpException, vous devez utiliser RpcException.

Lancer une RpcException
throw new RpcException('Invalid credentials.');

Avec l’exemple ci-dessus, Nest gérera l’exception levée et renverra l’objet error avec la structure suivante :

{
"status": "error",
"message": "Invalid credentials."
}

Filtres

Les filtres d’exception de microservices se comportent de manière similaire aux filtres d’exception HTTP, avec une petite différence. La méthode catch() doit renvoyer un Observable.

Exemple de filtre d'exception
import { Catch, RpcExceptionFilter, ArgumentsHost } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { RpcException } from '@nestjs/microservices';
@Catch(RpcException)
export class ExceptionFilter implements RpcExceptionFilter<RpcException> {
catch(exception: RpcException, host: ArgumentsHost): Observable<any> {
return throwError(() => exception.getError());
}
}

L’exemple suivant utilise un filtre spécifié manuellement. Tout comme avec les applications basées sur HTTP, vous pouvez également utiliser des filtres spécifiés par le contrôleur (c’est-à-dire préfixer la classe du contrôleur avec un décorateur @UseFilters()).

Utilisation d'un filtre d'exception
@UseFilters(new ExceptionFilter())
@MessagePattern({ cmd: 'sum' })
accumulate(data: number[]): number {
return (data || []).reduce((a, b) => a + b);
}

Héritage

Typiquement, vous allez créer des filtres d’exception entièrement personnalisés adaptés aux exigences de votre application. Cependant, il peut y avoir des cas d’utilisation où vous souhaitez simplement étendre le filtre d’exception de base et modifier le comportement en fonction de certains facteurs.

Pour déléguer le traitement des exceptions au filtre de base, vous devez étendre BaseExceptionFilter et appeler la méthode catch() héritée.

Filtre d'exception étendu
import { Catch, ArgumentsHost } from '@nestjs/common';
import { BaseRpcExceptionFilter } from '@nestjs/microservices';
@Catch()
export class AllExceptionsFilter extends BaseRpcExceptionFilter {
catch(exception: any, host: ArgumentsHost) {
return super.catch(exception, host);
}
}

L’implémentation ci-dessus est juste une structure démontrant l’approche. Votre mise en œuvre du filtre d’exception étendu inclura votre logique métier personnalisée (par exemple, le traitement de diverses conditions).