ข้ามไปเนื้อหาหลัก

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()

วิธีแก้ที่แนะนำ

เลือกสม่ำเสมออย่างใดอย่างหนึ่ง:

  1. Unquoted + z.date() — กระชับ, YAML จัดการให้เอง
  2. z.coerce.date() — ยืดหยุ่น ไม่สนว่าจะ quoted หรือเปล่า เหมาะถ้ามีไฟล์เก่าผสมอยู่

สิ่งที่ไม่ควรทำคือใช้ทั้งสองรูปแบบปนกันในโปรเจคเดียว เพราะ build จะพังเป็นบางไฟล์แบบงงมาก