[NestJS] จัดการ Error ด้วย Exception-filter มาทำให้เกิด User-Friendly Response กันเถอะ [PATH1]

Image placeholder
แวะมาทักทายกันได้

หากว่า 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 เพื่อเป็นกำลังใจ ให้ผู้เขียนด้วยนะครับ

แวะมาทักทายกันได้
donate

Categories: Tutorial Tags: #nestjs , #programing , 4253