diff --git a/nest-start/src/cats/cats.controller.ts b/nest-start/src/cats/cats.controller.ts index 59e46bf..0336174 100644 --- a/nest-start/src/cats/cats.controller.ts +++ b/nest-start/src/cats/cats.controller.ts @@ -1,12 +1,29 @@ -import { Controller, Delete, Get, Patch, Post, Put } from "@nestjs/common"; +import { + Controller, + Delete, + Get, + HttpException, + HttpStatus, + Patch, + Post, + Put, + UseFilters, +} from "@nestjs/common"; import { CatsService } from "./cats.service"; +import { HttpExceptionFilter } from "src/http-exception.filter"; @Controller("cats") export class CatsController { constructor(private readonly catsService: CatsService) {} @Get() + @UseFilters(HttpExceptionFilter) getAllCat() { + // throw new HttpException( + // { customized: true, success: false, message: "api is broken" }, + // HttpStatus.UNAUTHORIZED, + // ); + throw new HttpException("api is broken", HttpStatus.UNAUTHORIZED); return "all cat"; } diff --git a/nest-start/src/http-exception.filter.ts b/nest-start/src/http-exception.filter.ts new file mode 100644 index 0000000..856f216 --- /dev/null +++ b/nest-start/src/http-exception.filter.ts @@ -0,0 +1,34 @@ +import { + ArgumentsHost, + Catch, + ExceptionFilter, + HttpException, +} from "@nestjs/common"; +import { Response, Request } from "express"; + +@Catch(HttpException) +export class HttpExceptionFilter implements ExceptionFilter { + catch(exception: HttpException, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + const status = exception.getStatus(); + const error = exception.getResponse() as + | string + | { error: string; statusCode: number; message: string | string[] }; + + if (typeof error === "string") { + response.status(status).json({ + timestamp: new Date().toISOString(), + path: request.url, + error, + }); + } else { + response.status(status).json({ + timestamp: new Date().toISOString(), + path: request.url, + ...error, + }); + } + } +} diff --git a/nest-start/src/main.ts b/nest-start/src/main.ts index 0453316..9b09eeb 100644 --- a/nest-start/src/main.ts +++ b/nest-start/src/main.ts @@ -1,9 +1,11 @@ import { NestFactory } from "@nestjs/core"; import { AppModule } from "./app.module"; +import { HttpExceptionFilter } from "./http-exception.filter"; async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableCors(); + app.useGlobalFilters(new HttpExceptionFilter()); await app.listen(process.env.PORT ?? 8000); } bootstrap();