Astro在Netlify构建失败,Decap CMS发布文章报错求助
问题:Decap CMS发布文章后Netlify构建失败,提示frontmatter不符合集合schema
按照Astro官方教程完成基础搭建,配置了内容集合和Decap CMS,本地及Git提交部署均正常,但通过Decap CMS发布测试博客文章时,Netlify构建报错,提示文章frontmatter缺少pubDate、author等必填项,不符合集合schema。
配置文件
src/content/config.ts
// Import utilities from `astro:content` import { z, defineCollection } from "astro:content"; // Define a `type` and `schema` for each collection const postsCollection = defineCollection({ type: 'content', schema: z.object({ title: z.string(), pubDate: z.date(), description: z.string(), author: z.string(), image: z.object({ url: z.string(), alt: z.string().optional() }), tags: z.array(z.string()) }) }); // Export a single `collections` object to register your collection(s) export const collections = { posts: postsCollection, };
public/admin/config.yml
backend: name: git-gateway branch: main publish_mode: editorial_workflow media_folder: "src/assets" public_folder: "assets" collections: - name: "postsCollection" label: "" folder: "/src/content/posts" create: true slug: "{{slug}}" fields: - {label: "Layout", name: "layout", widget: "hidden", default: "blog"} - {label: "Title", name: "title", widget: "string"} - {label: "Publish Date", name: "pubDate", widget: "datetime"} - {label: "Description", name: "description", widget: "string"} - {label: "Author", name: "author", widget: "string"} - {label: "Featured Image", name: "image", widget: "image", fields: [ {label: "URL", name: "url", widget: "string"}, {label: "Alt Text", name: "alt", widget: "string"} ]} - {label: "Tags", name: "tags", widget: "list", field: {label: "Tag", name: "tag", widget: "string"}} - {label: "Body", name: "body", widget: "markdown"}
错误详情
4:40:00 PM: **Failed during stage "building site": Build script returned non-zero exit code: 2** 4:40:00 PM: **[InvalidContentEntryFrontmatterError] posts → 2024-02-04-my-first-blog-post-through-cms.md frontmatter does not match collection schema.** 4:40:00 PM: pubDate: Required 4:40:00 PM: author: Required 4:40:00 PM: image: Required 4:40:00 PM: tags: Required 4:40:00 PM: Hint: 4:40:00 PM: See https://docs.astro.build/en/guides/content-collections/ for more information on content schemas. 4:40:00 PM: Error reference: 4:40:00 PM: https://docs.astro.build/en/reference/errors/invalid-content-entry-frontmatter-error/ 4:40:00 PM: Stack trace: 4:40:00 PM: at getEntryData (file:///opt/build/repo/node_modules/astro/dist/content/utils.js:86:26) 4:40:00 PM: at async Object.transform (file:///opt/build/repo/node_modules/astro/dist/content/vite-plugin-content-imports.js:74:67) 4:40:00 PM: at async ModuleLoader.addModuleSource (file:///opt/build/repo/node_modules/rollup/dist/es/shared/node-entry.js:17810:36)
解决方案
1. 修正Decap CMS集合名称
Decap CMS的集合名称必须和Astro配置中的集合键完全一致。Astro的collections对象中键是posts,所以需要修改public/admin/config.yml中的集合名称:
collections: - name: "posts" # 从postsCollection改为posts label: "Posts" folder: "/src/content/posts" # 其他配置保持不变
2. 确保字段名称和格式完全匹配
检查Decap CMS的字段name是否和Astro schema中的键大小写完全一致(比如pubDate不能写成PublishDate),同时确认字段输出格式符合要求:
- pubDate:Decap的
datetimewidget默认输出ISO 8601格式字符串,Astro的z.date()可以直接解析。如果解析失败,可将Astro schema中的pubDate改为z.coerce.date(),兼容更多日期格式:pubDate: z.coerce.date(), - image字段:Astro schema中
image是嵌套对象,Decap配置已正确设置嵌套字段,但可将alt字段设为非必填,匹配Astro的optional()设置:{label: "Alt Text", name: "alt", widget: "string", required: false} - tags字段:Decap的
listwidget默认生成数组格式,符合Astro的z.array(z.string())要求,无需修改。
3. 验证生成的文章frontmatter
通过Decap CMS发布文章后,手动查看Git仓库中生成的src/content/posts/xxx.md文件,确认frontmatter格式如下(所有必填字段都存在且格式正确):
--- layout: blog title: "测试文章标题" pubDate: 2024-02-04T14:30:00Z description: "测试描述" author: "测试作者" image: url: "assets/test-image.jpg" alt: "测试图片" tags: ["测试标签1", "测试标签2"] ---
4. 重新部署
修改配置后,提交代码到Git仓库,触发Netlify重新构建,即可解决报错问题。
内容的提问来源于stack exchange,提问作者Kartik Mandar
相关产品推荐
相关产品推荐

