YAML dates ใน Astro Content Collections
YAML parse date โดยอัตโนมัติ — quoted vs unquoted ให้ผลต่างกัน และส่งผลกับ z.date() ใน Astro schema
เขียน frontmatter วันที่ใน Astro แล้วเจอ build error แบบนี้:
Expected date, received string
ทั้งที่ดูค่าแล้วเป็นวันที่ถูกต้อง ปัญหาอยู่ที่ quotation marks
YAML parse date อย่างไร
# unquoted — YAML parse เป็น Date object อัตโนมัติ
date: 2025-06-20
# quoted — YAML เก็บเป็น string ธรรมดา
date: '2025-06-20'
เมื่อค่าออกจาก YAML parser ชนิดข้อมูลต่างกัน — ตัวแรกเป็น Date, ตัวหลังเป็น string
ผลกระทบกับ Zod schema ใน Astro
// z.date() — รับเฉพาะ Date object → ใช้กับ unquoted date เท่านั้น
date: z.date()
// z.string() — รับเฉพาะ string → ใช้กับ quoted date เท่านั้น
date: z.string()
// z.coerce.date() — แปลงทั้ง string และ Date ให้เป็น Date object
// ยืดหยุ่นที่สุด รองรับทั้งสองรูปแบบ
date: z.coerce.date()
วิธีแก้ที่แนะนำ
เลือกสม่ำเสมออย่างใดอย่างหนึ่ง:
- Unquoted +
z.date()— กระชับ, YAML จัดการให้เอง z.coerce.date()— ยืดหยุ่น ไม่สนว่าจะ quoted หรือเปล่า เหมาะถ้ามีไฟล์เก่าผสมอยู่
สิ่งที่ไม่ควรทำคือใช้ทั้งสองรูปแบบปนกันในโปรเจคเดียว เพราะ build จะพังเป็นบางไฟล์แบบงงมาก