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

如何在Gatsby的createSchemaCustomization中让GraphQL顶级类型非空?

解决Gatsby中顶级MarkdownRemark字段非空化的问题

要让Gatsby生成的GraphQL查询中顶级MarkdownRemark字段变为非空类型,可以通过以下两种方法实现:

方法一:通过createResolvers强制指定非空类型

在gatsby-node.js中使用createResolvers钩子,重写markdownRemark查询字段的解析逻辑,并显式标记返回类型为非空:

exports.createResolvers = ({ createResolvers }) => {
  const resolvers = {
    Query: {
      markdownRemark: {
        resolve: async (source, args, context) => {
          const result = await context.nodeModel.findOne({
            type: "MarkdownRemark",
            query: { filter: { id: { eq: args.id } } }
          });
          // 实际场景中该字段不为空,若意外为空可抛出错误提示
          if (!result) throw new Error("目标Markdown内容未找到");
          return result;
        },
        type: "MarkdownRemark!"
      }
    }
  };
  createResolvers(resolvers);
};

这种方式直接修改查询字段的类型定义,让GraphQL系统识别该字段不会返回空值。

方法二:自定义Schema覆盖默认Query类型

在createSchemaCustomization钩子中,重新定义Query类型里的markdownRemark字段,强制添加非空约束:

exports.createSchemaCustomization = ({ actions }) => {
  const { createTypes } = actions;
  const typeDefs = `
    type Query {
      markdownRemark(id: String!, frontmatter: FrontmatterFilterInput!): MarkdownRemark!
      # 保留其他默认查询字段,避免覆盖后功能丢失
      allMarkdownRemark(
        sort: [MarkdownRemarkSortInput!]
        filter: MarkdownRemarkFilterInput
        limit: Int
        skip: Int
      ): MarkdownRemarkConnection!
    }
  `;
  createTypes(typeDefs);
};

注意要完整保留Query类型中其他需要的字段(比如allMarkdownRemark),仅修改目标字段的非空标记即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:14:57