Joi มี method สำหรับการระบุข้างต้น คือ
required()
และ optional()
ตามลำดับ ซึ่งถ้าไม่ระบุจะเป็น optional โดยอัตโนมัติ แต่มันไม่ได้จบเพียงเท่านี้ เพราะ Library ตัวนี้มีบางอย่างที่ขัดกับ validator ของ framework อื่นหลบซ่อนอยู่สำหรับ
required()
จะเป็นปกติเหมือน framework ทั่วไป คือ field นั้นต้องมีค่า ซึ่งค่านั้นต้องไม่ใช่ null หรือ empty stringสำหรับ
optional()
จะมีความแตกต่างจาก framework อื่น คือ field นั้นต้องมีค่า (ซึ่งค่านั้นต้องไม่ใช่ null หรือ empty string) หรือ field นั้นต้องหายไปเลย (undefined) อย่างใดอย่างหนึ่งเท่านั้นอย่างไรก็ตาม สำหรับ framework ทั่วไป ในกรณีที่ไม่ระบุว่า required ความเป็นไปได้ของ field นั้น คือ มีค่าเป็นอะไรก็ได้รวมถึง null และ empty string ด้วย หรือ field นั้นจะหายไปเลยก็ได้
จะเห็นได้ว่า Joi ต่อให้เป็น optional ก็ไม่สามารถส่งค่า null หรือ empty string มาได้ วิธีแก้ไข คือ เพิ่ม
.allow(null)
และ .allow('')
ต่อท้าย field ที่เป็น optional ด้วยปล. มีคนเปิด Issue เกี่ยวกับเรื่องนี้ ให้รวมค่า null กับ empty string เป็น optional ของ Joi ด้วย แต่ก็ได้คำตอบว่า มันโคตรจะไม่ปกติเลยหรือมันไม่ใช่ common use case ซึ่งจากคำตอบก็รู้แล้วแน่ๆว่า จะไม่มีการแก้ไขเกี่ยวกับเรื่องนี้ในอนาคตแน่นอน
สำหรับข้อมูลเพิ่มเติม สามารถอ่านได้ที่
How to allow a string or null?
Joi.string().optional() doesn't treat an empty string as unset