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
.
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
.
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()
).
@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.
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).