[NestJS] จัดการ Error ด้วย Exception-filter มาทำให้เกิด User-Friendly Response กันเถอะ [PATH1]
หากว่า User เรียกผ่าน Browser ด้วย End-Point URL หนึ่งจะพบว่าหน้าจอไม่เกิดอะไรขึ้น ภายใต้จิตสำนึกของมนุษย์อะไรที่ช้า หรือ ค้างไปนานๆ เพียงแค่ 3 นาทีก็จะไม่รอ ปิดระบบหรือเลิกใช้ไปเลย นี้คือความน่ากลัวในฝั่ง Business ซึ่งจริงๆแล้วระบบไม่ได้ไม่ทำงาน แต่เกิดข้อผิดพลาดที่ไม่ได้แจ้งเตือนให้ใครทราบต่างหาก ดังนั้นสิ่งนี้จึงเป็นปัญหา มาทำให้เกิด User-Friendly Response กันเถอะ
หากใครยังจำได้ในเรื่อง Data Validation ที่เคยเขียนบทความไปก่อนหน้านี้ ซึ่งเป็นการป้องกันข้อมูลที่ไม่ถูกต้อง ที่ได้รับมาจากภายนอกระบบ ซึ่ง Exception ก็เป็นการส่งข้อมูลออกจากระบบไปให้ User ที่ได้รับได้เข้าใจระบบ และ เกิด User Friendly เช่นเดียวกัน
[NestJS] Data Validation With Pipe
[PATH-1]
https://www.sklsongkiat.com/articles/detail/nestjs-data-validation-with-pipe-part1
[PATH-2]
https://www.sklsongkiat.com/articles/detail/nestjs-data-validation-with-pipe-part2
ยกตัวอย่างของ Error ที่ไม่ได้แจ้งเตือน ของ Method FindOne() ตาม Document ด้านล่าง ผู้เขียนได้ไป Query ข้อมูลมา 1 แถวด้วย DATA_ID ตัวหนึ่งแล้วปรากฏว่า DATA_ID ตัวนี้ไม่มีข้อมูล แล้วเกิด Error แบบนี้ตามรูปภาพด้านล่าง
ที่เกิดขึ้น เพราะยังไม่ได้ Handle Exception เวลาที่เกิด log แบบนี้ที่หน้า browser อาจจะไม่ได้แสดงก็จะเกิดหน้าจอว่างๆ ดังนั้น ถ้าอยากให้เกิดมีอะไรเกิดขึ้นที่หน้าจอ ดังตัวอย่างด้านล่างนี้ ก็ต้องมารู้จักกับ Throw
Throwing Standard Exceptions
ขว้าง (Throwing) เจอ Error อะไรก็ขว้างเข้าไปในฟังก์ชันเลย ทำนองนั้น NestJS ได้เตรียมเอาไว้มาในรูปแบบของ Class ที่ชื่อว่า HttpException วิธีใช้ก็ง่ายๆ ประกาศเอาไว้ในเงื่อนไขที่ต้องการ เช่น
if (response === undefined) {
throw new HttpException(“NOT FOUND”, HttpStatus.NOT_FOUND);
}
Constructor ของ HttpException จะรับ Argument อยู่ 2 ตัว คือ
Response : ผู้เขียนใส่ข้อความไว้ว่า NOT FOUND สามารถที่จะระบุได้ทั้ง string หรือ json object ได้
Status : ผู้เขียนใช้ Enum ของ HttpStatus สามารถเลือกใช้ได้ตาม link HttpStatus https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
ผลลัพท์ที่ได้จะเป็นดังนี้
กรณีที่เราต้องการแก้ไข parameter ให้แก้ไข แบบนี้
if (response === undefined) {
throw new HttpException({
status: HttpStatus.NOT_FOUND,
error: 'This is a custom message not found',
}, HttpStatus.NOT_FOUND);
}
ผลลัพท์ที่ได้ก็จะเปลี่ยนไป เป็นแบบนี้
นอกจาก HttpException แล้วยังมี Exception แบบอื่นๆอีก ที่ NestJS Build-In มาให้แล้ว สามารถเข้าไปดูได้ตาม link นี้ได้เลย
https://docs.nestjs.com/exception-filters#built-in-http-exceptions
Custom Exception
ในหลายๆเคสหากว่า Exception ที่ Build-In ไม่ได้จำเป็นต้องนำมาใช้ หรืออยากจะปรับแต่งบางอย่าง ก็สามารถที่จะ Custom เองได้นะ โดยสร้างไฟล์ขึ้นมาใหม่ แล้ว Extend Class นั้นมา ยกตัวอย่าง HttpException
// custom.exception.ts
import { HttpException, HttpStatus } from "@nestjs/common";
export class ForbiddenException extends HttpException {
constructor() {
super('Forbidden', HttpStatus.FORBIDDEN);
}
}
เวลาเรียกใช้ก็ทำเหมือนเดิม โดยการนำไปผ่าน throwing
if (response === undefined) {
throw new ForbiddenException();
}
ผลลัพท์ที่ได้
อ่านต่อ PATH2 ด้วยนะ ยังไม่จบครับ
https://www.sklsongkiat.com/articles/detail/nestjs-error-exception-filter-user-friendly-response-path2
click google ads สัก 1-2 click เพื่อเป็นกำลังใจ ให้ผู้เขียนด้วยนะครับ