[NestJS] จัดการ Error ด้วย Exception-filter มาทำให้เกิด User-Friendly Response กันเถอะ [PATH2]
หากว่า User เรียกผ่าน Browser ด้วย End-Point URL หนึ่งจะพบว่าหน้าจอไม่เกิดอะไรขึ้น ภายใต้จิตสำนึกของมนุษย์อะไรที่ช้า หรือ ค้างไปนานๆ เพียงแค่ 3 นาทีก็จะไม่รอ ปิดระบบหรือเลิกใช้ไปเลย นี้คือความน่ากลัวในฝั่ง Business ซึ่งจริงๆแล้วระบบไม่ได้ไม่ทำงาน แต่เกิดข้อผิดพลาดที่ไม่ได้แจ้งเตือนให้ใครทราบต่างหาก ดังนั้นสิ่งนี้จึงเป็นปัญหา มาทำให้เกิด User-Friendly Response กันเถอะ
หากใครยังจำได้ในเรื่อง Data Validation ที่เคยเขียนบทความไปก่อนหน้านี้ ซึ่งเป็นการป้องกันข้อมูลที่ไม่ถูกต้อง ที่ได้รับมาจากภายนอกระบบ ซึ่ง Exception ก็เป็นการส่งข้อมูลออกจากระบบไปให้ User ที่ได้รับได้เข้าใจระบบ และ เกิด User Friendly เช่นเดียวกัน
อ่าน PATH1 ก่อนนะ
[NestJS] จัดการ Error ด้วย Exception-filter มาทำให้เกิด User-Friendly Response กันเถอะ [PATH1]
Exception Filters
ในขณะที่การทำ Throwing ต่างๆ ที่ผ่านมาสามารถรองรับในหลายๆ กรณีในการทำ Exception แล้วก็ตาม ในบางกรณีคุณอาจจะต้องการควบคุมหรือสร้างให้เป็น Exception Layer ให้เป็นระบบมากขึ้น อย่างเช่น ทำระบบ Loggin ที่มี Schema JSON ที่แตกต่างๆ เพราะการ Throwing ที่ผ่านๆมาจะได้รับ Schema ที่ Build-in ทำให้ Customize ได้น้อยกว่า ซึ่ง Exception Filter เกิดมาเพื่อสิ่งนั้น เมื่อใช้ Exception Filter แล้วจะสามารถควบคุมการส่ง Response ไปยัง Client ได้ดีขึ้น
สร้างไฟล์ขึ้น ชื่อว่า exceptionfilter.exception.ts
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
catch(exception: unknown, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const request = ctx.getRequest();
const status =
exception instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
response.status(status).json({
message_code: status,
message: "This is message of status not found from json object",
timestamp: new Date().toISOString(),
});
}
}
ใน Block ของ Json ด้านล่างจะเป็น Parameter ทั้งหมดที่จะไปแสดง เมื่อเกิด Error แล้วเข้า Throwing
Binding Filter
@Post()
@UseFilters(new ExceptionsFilter())
async create(@Body() createCatDto: CreateCatDto) {
throw new ForbiddenException();
}
หลังจากที่สร้างไฟล์ exceptionfilter.exception.ts เสร็จก็นำ Class ที่สร้างขึ้นมาทำ Binding
ข้อสำคัญเรียกใช้ที่ Module ไหน อย่าลืมไป Import ลง Providers ด้วยเพื่อใช้งาน
import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
@Module({
providers: [
{
provide: APP_FILTER,
useClass: ExceptionFilter,
},
],
})
export class AppModule { }
มาดูผลลัพท์ หลังจากที่สร้าง Exception Filter
สรุป
ระบบที่ดีจะต้องมีการจัดการทั้งข้อมูลเข้าและข้อมูลออกจากระบบ อย่าจัดการทั้ง Pipe DataValidation ข้อมูลเข้าระบบ ว่าส่งมาอย่างถูกต้องหรือไม่ และ ข้อมูลออกว่ามีการแจ้งเตือนให้ Client รู้หรือไม่ว่าเกิดปัญหาอะไร เพื่อที่ Front-End จะนำไปจัดการ การแสดงผลได้อย่างถูกต้อง
click google ads สัก 1-2 click เพื่อเป็นกำลังใจ ให้ผู้เขียนด้วยนะครับ
REF:
https://docs.nestjs.com/exception-filters
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status