[NestJS Data Validation With Pipe [PART2]
เปิดบทความด้วยคำถามที่ว่า “ทำไมต้องทำ 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