Nestjs: สร้าง Custom Decorator HTTP route handler ใช้กันเถอะ
ชาว Nestjs developer ก็คงได้พบได้เจอกับ Decorator กันมาแล้วบางแล้ว ซึ่ง decorator เหล่านั่นจะเป็น built in ที่มีมาให้แล้ว ..แต่ในบทความนี้เราจะมาลองเขียนเจ้าตัว decorator ขึ้นมาเองกัน!
Decorator
: คือ expression ที่จะคืนค่าเป็น function.
Decorator จะมี “@” วางไว้หน้าชื่อ โดยมันสามารถใช้ให้กับ class, method หรือจะเป็น property. บทความนี้จะเน้นไปที่เจ้าตัว Decorator HTTP route handler ซึ่งเราจะพบเห็นได้บ่อยในการเขียน API ไม่ว่าจะเป็น @Request() / @Req() , @Response() / @Res() , @Body(), @Query(), @Param(), etc.. จะดีกว่าไหมถ้าเราจะใช้ decorator ของเราเอง
Create Custom decorator
จากรูป [1] Create custom decorator ชื่อ SetUser โดยหน้าที่ของ decorator นี้จะทำการต่อชื่อจริง, ชื่อกลาง และนามสกุล เข้าด้วยกัน
อธิบายโค้ด: ในการสร้าง customDecorator จะใช้ method createParamDecorator() ซึ่งเป็น built in ของ Nestjs_common ซึ่งภายในจะเป็นฟังก์ชันที่มี parameter data และ ctx ซึ่งมี type เป็น ExecutionContext ซึ่งตัว ctx จะเรียก .switchToHttp() ต่อด้วย getRequest() เพื่อ เข้าถึง request object ที่วิ่งเข้ามา จากนั้นก็ destructuring ที่ body นำค่า firstName, middleName และ lastName มาต่อกันและเก็บไว้ในตัวแปร fullName ส่วน argument อื่นก็ให้คืนกลับไปตามเดิม
จากรูป [2] จะนำ SetUser decorator ที่เราได้สร้างไว้ก่อนหน้ามาใช้งาน โดยจะรับค่ามาในรูปแบบ Data Transfer Object (DTO) ดังรูป [3]. เมื่อมี request เข้ามา ค่า input object ก็จะวิ่งผ่าน SetUser decorator และเก็บอยู่ในตัวแปร user
*สังเกตว่าตัว decorator จะอยู่ระหว่างกลางระหว่าง client และ Route handler (request ที่เข้ามาจะผ่าน decorator ก่อนที่จะถึง route)
ใช้ Postman ยิงทดสอบดังรูป ก็จะได้ผลลัพธ์ ตามที่ออกแบบไว้ใน decorator
สรุป
Decorator นั้นถูกใช้ในเกือบทุกเรื่องของ Nestjs มีทั้งแบบ built in ที่มีมาให้ และยังเปิดโอกาสให้เราสร้างขึ้นมาได้เอง เพื่อประยุกต์ใช้กับเหตุการณ์นั้น ๆ และยังสามารถนำไปใช้งานได้ในอีกหลาย ๆ ที่ (reusability) เรียกได้ว่าเป็นเครื่องทุ่นแรงให้กับเราชาวเดฟกันไปอีก แหมะ! มีประโยชน์จริง ๆ ฝากไว้แค่นี้เน่อ ขอบคุณครับ :)