Refactor HttpExceptionFilter to unify the error response

This commit is contained in:
faris Aljohari
2025-01-08 00:14:11 -06:00
parent 274d9dce90
commit 38b6cd1a62

View File

@ -5,34 +5,55 @@ import {
HttpException, HttpException,
HttpStatus, HttpStatus,
} from '@nestjs/common'; } from '@nestjs/common';
import { Response } from 'express'; import { Request, Response } from 'express';
@Catch() @Catch()
export class HttpExceptionFilter implements ExceptionFilter { export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: unknown, host: ArgumentsHost) { catch(exception: unknown, host: ArgumentsHost): void {
const ctx = host.switchToHttp(); const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>(); const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>(); const request = ctx.getRequest<Request>();
const status =
exception instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
const message = const status = this.getStatus(exception);
exception instanceof HttpException const errorMessage = this.getErrorMessage(exception);
? exception.getResponse() const formattedStatus = this.formatStatus(status);
: 'Internal server error';
const errorResponse = { const errorResponse = {
statusCode: status, statusCode: status,
timestamp: new Date().toISOString(), timestamp: new Date().toISOString(),
path: request.url, path: request.url,
error: message, error:
typeof errorMessage === 'string'
? {
message: errorMessage,
error: formattedStatus,
statusCode: status,
}
: errorMessage,
}; };
// Optionally log the exception console.error('Error occurred:', exception);
console.error(`Error occurred:`, exception);
response.status(status).json(errorResponse); response.status(status).json(errorResponse);
} }
private getStatus(exception: unknown): HttpStatus {
return exception instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
}
private getErrorMessage(exception: unknown): string | object {
return exception instanceof HttpException
? exception.getResponse()
: 'Internal server error';
}
private formatStatus(status: HttpStatus): string {
return HttpStatus[status]
.toLowerCase()
.replace('_', ' ')
.split(' ')
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
}
} }