Skip to main content
6

สารจากนักเขียน

สวัสดีครับทุกคนเชื่อว่าหลาย ๆ คนก็อาจจะเคยได้ยินเกี่ยวกับ Best Practices หรือแนวปฏิบัติที่ดีกันมาบ้างวันนี้ผมก็มี Best Practices ของ NestJS เรื่องของการทำ Error Handling และ Logging มาฝากกัน

เขียนโดย
Thapanon Sodngam
Junior Software Developer

บทความนี้ตีพิมพ์ และ เผยแพร่เมื่อ 24 สิงหาคม 2566

เริ่มด้วยการทำ Error Handling กันก่อนเลยให้เราสร้าง NestJS app ขึ้นมาก่อนด้วย NestCLI

nest new nest-demo

หลังจากนั้นจะได้ NestJS Project ออกมาต่อมาเรามาทำความเข้าใจเรื่องของ Error Handling ของ NestJS กันก่อน

Error handling : คือการจัดการสถานการณ์ที่ไม่คาดคิดที่อาจเกิดขึ้นระหว่างการทำงานของ Application ได้อย่างที่เราต้องการ โดย NestJS มีวิธีการจัดการกับสถานการณ์เหล่านั้นได้อย่างประสิทธิภาพด้วยสิ่งที่เรียกว่า Exception Filters. โดย Exception Filters จะทำหน้าที่ก็คือสกัด สิ่งที่อาจเกิดขึ้นแล้ว throw ออกไป หรือจะสั่งค่าตามที่เราต้องการไปยัง client ได้นั่นเอง งั้นเรามาสร้าง ExceptionFilter กัน

import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from '@nestjs/common';
import { Request, Response } 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();


response.status(status).json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
message: exception.message,
});
}
}

และนี่ก็คือ Code ที่เราเขียนขึ้นมาโดยเราจะเพิ่ม response ไปได้หรือปรับแต่งก่อนจะส่งกลับไปยัง Client นั่นเองแล้วก็เพิ่ม Code ที่ทำให้ Application ของเรานำ HttpExceptionFilter ไปใช้โดยเพิ่ม Code ด้านล่างไปใน main.ts

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.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000);
}
bootstrap();

และนี่คือผลลัพธ์

Exception Filters ที่ NestJS ทำให้มา

Exception Filters ที่เราเขียนมา

นอกจากนี้เรายังสามารถทำ Exception แบบเฉพาะเจาะจงได้อีกด้วยนะครับอย่างเช่น custom NotFoundException ถ้าใครสนใจก็ไปหาอ่านเพิ่มเติมกันได้นะ

ต่อไปเรามาต่อกันที่ Logging

Logging โดยทั่วไปจะช่วยให้เรานั้นสามารถสอดส่อง Application ของเราได้ทำให้เราสามารถพบปัญหาต่าง ๆ ได้ถ้าเราทำ Log ออกมาดีก็จะทำให้เราสามารถส่องการทำงานของ App ได้ดีขึ้นนั่นเอง ในส่วนของ NestJS ก็มี default logger ให้ด้วนน้าหน้าตาตามรูปด้านล่างเลย

 

เรามาลองเขียน Logger กัน

import { LoggerService } from '@nestjs/common';

export class EmojiLogger implements LoggerService {
log(message: string) {
this.writeToFile('📢 ' + message);
}

error(message: string, trace: string) {
this.writeToFile('❌ ' + message);
this.writeToFile('🔍 Stack Trace: ' + trace);
}

warn(message: string) {
this.writeToFile('⚠️ ' + message);
}

debug(message: string) {
this.writeToFile('🐞 ' + message);
}

private writeToFile(message: string) {
// Implement the logic to write logs to a file here.
console.log(message); // For demonstration purposes, we'll just log to the console.
}
}

และนี่คือ class logger ที่เราสร้างขึ้นมาแต่แค่ทำเป็น Emoji นะครับ สามารถพลิกอะไรได้อีกเยอะเลย
แต่เดี๋ยวก่อนหลังจากเรา สร้าง EmojiLogger เสร็จแล้วก็ต้องบอกกับ application ของเราก่อนว่าเราจะใช้ logger ตัวนี้แทนนะโดยใน main.ts จะเปลี่ยนไปเป็นแบบนี้

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { EmojiLogger } from './emoji-logger';

async function bootstrap() {
const app = await NestFactory.create(AppModule, {
logger: new EmojiLogger(),
});
await app.listen(3000);
}
bootstrap();

และเมื่อเรา log ออกมาก็จะเป็นแบบนี้เลย

เป็นยังไงกันบ้างครับทุกคนกับแนวปฏิบัติหรือ Best Practices นั่นเองหวังว่าวันนี้ทุกคนจะได้ความรู้และนำไปปรับใช้กันได้สำหรับวันนี้ขอตัวลอนไปก่า เอ้ย ลาไปก่อนสวัสดีฮัฟฟู่ววว

ระบบฝึกทักษะ การเขียนโปรแกรม

ที่พร้อมตรวจผลงานคุณ 24 ชั่วโมง

  • โจทย์ปัญหากว่า 200 ข้อ ที่รอท้าทายคุณอยู่
  • รองรับ 9 ภาษาโปรแกรมหลัก ไม่ว่าจะ Java, Python, C ก็เขียนได้
  • ใช้งานได้ฟรี ! ครบ 20 ข้อขึ้นไป รับ Certificate ไปเลย !!
เข้าใช้งานระบบ DevLab ฟรี !เรียนรู้เพิ่มเติม

เรียนรู้ไอที “อัพสกิลเขียนโปรแกรม” จากตัวจริง
ปั้นให้คุณเป็น คนสายไอทีระดับมืออาชีพ

BorntoDev

Author BorntoDev

BorntoDev Co., Ltd.

More posts by BorntoDev

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า