Issue
While using NestJS to create API's I was wondering which is the best way to handle errors/exception. I have found two different approaches :
- Have individual services and validation pipes
throw new Error(), have the controllercatchthem and then throw the appropriate kind ofHttpException(BadRequestException,ForbiddenExceptionetc..) - Have the controller simply call the service/validation pipe method responsible for handling that part of business logic, and throw the appropriate
HttpException.
There are pros and cons to both approaches:
- This seems the right way, however, the service can return
Errorfor different reasons, how do I know from the controller which would be the corresponding kind ofHttpExceptionto return? - Very flexible, but having
Httprelated stuff in services just seems wrong.
I was wondering, which one (if any) is the "nest js" way of doing it?
How do you handle this matter?
Solution
Let's assume your business logic throws an EntityNotFoundError and you want to map it to a NotFoundException.
For that, you can create an Interceptor that transforms your errors:
@Injectable()
export class NotFoundInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
// next.handle() is an Observable of the controller's result value
return next.handle()
.pipe(catchError(error => {
if (error instanceof EntityNotFoundError) {
throw new NotFoundException(error.message);
} else {
throw error;
}
}));
}
}
You can then use it by adding @UseInterceptors(NotFoundInterceptor) to your controller's class or methods; or even as a global interceptor for all routes. Of course, you can also map multiple errors in one interceptor.
Try it out in this codesandbox.
Answered By - Kim Kern Answer Checked By - David Marino (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.