内容 schema 兜住 YAML 空值,修掉手写偶得触发的构建失败

问题
新增的 src/content/thoughts/20260622-夏至已至.md 让 build 直接失败:
  InvalidContentEntryDataError: thoughts → 20260622-夏至已至
  tags:   Expected type "array", received "object"
  images: Expected type "array", received "object"
报错里那个 "object" 很误导 —— 它其实是 null(JS 里 typeof null === "object")。

根因
该文件的 frontmatter 写了两个空字段:
  images:
  tags:
YAML 把「只写 key、后面什么都不跟」解析成 null,而不是 undefined。
而 schema 用的是 z.array(z.string()).optional().default([]) ——
.optional() 只放行 undefined,.default() 也只对 undefined 生效,
所以 null 会直接被判为类型不符。

这不是那一个文件的问题,而是一类写法的问题:手写 frontmatter 时把不要的字段
留空太自然了。而且这类报错信息完全指不出真正的原因,很浪费时间。

改法
在 content.config.ts 顶部加三个 helper,把 null 当作「没填」处理:
  text(fallback = "")   文本,留空 → fallback
  optionalText()        可选文本,留空 → undefined(保持原类型)
  textList()            字符串数组,留空 → []
然后套用到 posts / thoughts / studies 里所有「留空应该算默认值」的字段
(description / image / tags / category / lang / password / prev* / next*、
thoughts 的 title / tags / location / weather / images、studies 的三个可选文本)。

注意:只改了「留空该走默认」的字段。像 posts.title、published、
studies.title / status / started 这些必填项保持原样 —— 它们留空本来就该报错。

验证
- 清内容缓存重建:pnpm build 退出码 0,不再报 InvalidContentEntryDataError
- 那条偶得正常产出(tags / images 都成了空数组,location / weather 保留)
- 抽查其他条目:树莓派那篇的标签与任务列表、首页的偶得列表均正常
This commit is contained in:
dsh
2026-09-17 20:35:56 +08:00
parent 90d24f8948
commit 8e08fc5094
3 changed files with 55 additions and 19 deletions
@@ -0,0 +1,14 @@
---
published: 2026-06-21
title: 夏至已至
location: 张掖·甘州区
weather: 晴
images:
tags:
pinned: false
---
> 随笔,只是想写一些自己的想法
转眼之间已是夏至,太阳再次来到北回归线,时间就是这样,总是过得如此之快。突然之间就回想起十年前,也就是2016年那个夏天了,那时我刚参加完高考,面对自己的未来不知所措,踏上了前往军检的火车。人生关键的选择往往并不多,只不过当时是无法感受到其强劲的影响。
当时自己也是一个懵懂无知的少年,缺少自己的想法和主见。有的时候可能这就是命吧,谁也不知道自己的未来会怎样,但是依然要积极面对生活。