You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gatsby教程中GraphiQL无date字段,formatString对datePublished失效

Gatsby MDX GraphQL字段不匹配及formatString无效问题解决

字段不匹配的原因

不是GraphQL或Gatsby版本更新导致的差异——GraphQL的allMdx返回的frontmatter字段完全对应你本地MDX文件里写的frontmatter键值对。教程里的MDX文件frontmatter用的是title和date,而你自己的MDX文件里定义的是name和datePublished,所以GraphiQL里显示的是后者。

formatString无效的解决方法

formatString是Gatsby专为Date类型字段提供的格式化参数,如果你的datePublished被识别为字符串类型(比如MDX里写的是未被解析的文本日期),就无法使用这个参数。解决思路分两种:

方法1:自定义Schema将字段转为Date类型

在项目根目录的gatsby-node.js中添加Schema自定义配置,强制把datePublished识别为Date类型并启用日期格式化:

exports.createSchemaCustomization = ({ actions }) => {
  const { createTypes } = actions;
  const typeDefs = `
    type MdxFrontmatter {
      datePublished: Date @dateformat
    }
    type Mdx implements Node {
      frontmatter: MdxFrontmatter
    }
  `;
  createTypes(typeDefs);
};

配置完成后重启Gatsby开发服务,就能在GraphiQL里给datePublished添加formatString参数了:

query MyQuery {
  allMdx {
    nodes {
      frontmatter {
        datePublished(formatString: "YYYY-MM-DD")
        name
      }
    }
  }
}

方法2:前端手动格式化字符串日期

如果不想修改Schema,可以在获取到数据后,用前端日期库(比如date-fns、dayjs)来格式化字符串类型的datePublished:

// 示例用date-fns
import { format } from 'date-fns';

// 假设从GraphQL拿到的节点数据为node
const formattedDate = format(new Date(node.frontmatter.datePublished), 'yyyy-MM-dd');

内容的提问来源于stack exchange,提问作者BartTheProgrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:12:21