[NestJS Data Validation With Pipe [PART2]

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

เปิดบทความด้วยคำถามที่ว่า ทำไมต้องทำ Data Validation“

 

เทคนิค การโจมตีแบบ Injection Attacks ยังคงเป็นการโจมตีเว็บไซต์ที่ติดอันดับ Top10 ของ OWASP ทำให้การตรวจสอบข้อมูลที่วิ่งเข้ามาในระบบ มีความสำคัญอย่างมากในด้าน security

 

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


ต่อจาก [PATH1]  [NestJS] Data Validation With Pipe [PART1]


ฝากกดโฆษณา Google Ads สัก click  เพื่อเป็นกำลังใจแก่ผู้เขียนด้วยนะครับ


Object schema validation

 

บ่อยครั้ง จะต้องทำ validation object จึงนำหลักการที่ชื่อ DRY (Don’t Repeat Youself อย่า code ซ้ำ ให้ code ที่ใช้บ่อยๆไว้ที่เดียวมาใช้ จึงกลายมาเป็นที่มาของการทำ Schema-based Validation ดังนั้น Joi library จึงจำเป็นที่จะนำมาทำ Schema

 

ให้สร้างไฟล์สำหรับทำ Schema ขึ้นมาชื่อ TaskSchema.ts




เอามาใส่ใส่ API Controller




ใน validation-pipe.ts ให้นำ property มาตรวจสอบ คือ นำ schemaObj มาเข้า method validate




จาก schema เรากำหนด  name และ description ไว้ว่า required ต้องส่งมาด้วย




มาลองทดสอบกัน ในเคสแรกแบบ success case จะเห็นว่าผ่านไปได้ตามปกติ




คราวนี้ก็ลองไม่ใส่ค่าอะไรเลย ก็จะได้ error อย่างที่เห็น



นอกจาก required แล้วสามารถดู method อื่นๆได้จาก https://joi.dev/api/?v=17.4.0

 

Nest ใช้งานได้ดีกับ class-validator library เป็น library ที่ให้สามารถทำ decorator ได้เป็นอย่างดี  Decorator-base validation ช่วยให้ง่ายขึ้นเมื่อ มีการรวมการใช้งาน PIPE ให้เข้าถึง metatype ให้ทำการติดตั้ง package class-validator ก่อน



หลังจากที่ติดตั้งเสร็จแล้ว ให้ไปที่ ไฟล์ DTO ที่นำมาใช้กับ API ที่จะทำการ validation

 

ไฟล์ของผู้เขียนสร้างไว้อยู่แล้วชื่อCreateTaskDTO



จากนั้นก็ให้ทำการปรับ code โดยใช้ Annotation กำหนดว่าในแต่ละ property เป็น type อะไร หรือจะเช็คว่าข้อมูลที่ส่งเข้ามามีข้อมูลหรือเปล่า โดยใช้ @IsNotEmpty() ก็ได้




นอกนั้นลองดู method อื่นๆได้ที่ https://github.com/typestack/class-validator#manual-validation

 

หลังจากที่สร้าง class-validator เสร็จแล้วก็ไป ตั้งค่า Global pipe ที่ main.js ด้วยไม่งั้นก็ไม่ทำงาน




ลองทดสอบกันดู




สังเกตได้ว่า ค่าที่ส่งว่างอยู่ validation จึงทำงานพร้อมส่ง message กลับมาให้ด้วยว่า ห้ามเป็นค่าว่าง

 

สรุป

 

NestJS เป็นเครื่องมือที่มีประสิทธิภาพตัวหนึ่ง สามารถตรวจสอบข้อมูลก่อนเข้ามาในระบบจากเครื่องมือที่มีอยู่แล้ว โดยสามารถที่จะจัดการได้หลากหลายรูปแบบ ทั้ง Build-in pipes, Custom pipe, Object Schema validation (Joi Library) และ class-validation ทั้งนี้ขึ้นอยู่ลักษณะงานว่าจะต้อง Custom มากน้อยแค่ไหนก็อยู่ที่จะเลือกใช้

 

REF:

https://dsebastien.medium.com/input-validation-with-nestjs-7184ba81af7e

https://betterprogramming.pub/nest-js-and-the-custom-validation-pipe-231130fda040

https://docs.nestjs.com/pipes

 

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

Categories: Tutorial Tags: #nestjs , 2231