自定义 Gatsby / Contentful Schema

Posted

技术标签:

【中文标题】自定义 Gatsby / Contentful Schema【英文标题】:Customizing Gatsby / Contentful Schema 【发布时间】:2020-08-18 13:56:00 【问题描述】:

我正在尝试为 Contentful 源添加 createSchemaCustomization,该源可能没有我感兴趣的字段,因此 Gatsby 无法推断类型。

我已经创建了自定义,这样我的模板查询就不会抱怨,但如果有一个条目,它也不会被拾取。我确定我可能没有正确设置自定义。这就是我所拥有的(@infer 标志似乎并没有起到多大作用):

exports.createSchemaCustomization = ( actions ) => 
  const  createTypes  = actions;
  const typeDefs = `
    type ContentfulUniversalProduct implements Node @infer 
      datesAndPricesSnippets: [DatesAndPricesSnippet]
    
    type DatesAndPricesSnippet implements Node @infer 
      id: String
      title: String
      icon: String
      iconColor: String
      body: WithChildMarkdownRemark
    
    type WithChildMarkdownRemark implements Node @infer 
      childMarkdownRemark: MarkdownRemark
    
  `;
  createTypes(typeDefs);
;

我的查询。

如果 Contentful 中有 datesAndPricesSnippets,并且我没有上述 schemaCustomization,则此查询有效。

如果我确实进行了自定义,则此查询的输出为 null - 无论内容是否为 Contentful。

export const query = graphql`
  query($slug: String!, $id: String!) 
    contentfulUniversalProduct 
      datesAndPricesSnippets 
        id
        title
        body 
          childMarkdownRemark 
            html
          
        
        icon
        iconColor
      
    
  
`

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,以下帮助了我:

    安装gatsby-plugin-schema-snapshot 生成schema.gql 文件,GATSBY_UPDATE_SCHEMA_SNAPSHOT=y yarn develop 为我完成了 观察schema.gql 文件,您对createTypes 所做的更改会显示出来

在我的情况下,添加 @link 调用有助于返回节点而不是 null

exports.createSchemaCustomization = ( actions ) => 
  const  createTypes  = actions
  const typeDefs = `
    type ContentfulThing implements Node 
      fieldWithModules: [SomeBigUnion] @link(by: "id", from: "fieldWithModules___NODE")
    
  `
  createTypes(typeDefs)

【讨论】:

如果您将GATSBY_UPDATE_SCHEMA_SNAPSHOT=y(或任何您想要的)添加到.env.development.env.production,那么您不需要将它添加到#2 中的命令中。

以上是关于自定义 Gatsby / Contentful Schema的主要内容,如果未能解决你的问题,请参考以下文章

Gatsby Contentful-GraphQL查询错误:未知类型“ ContentfulFixed”

Gatsby + contentful + Netlify 的私人/登录部分

使用 gatsby-source-contentful 访问您的内容空间失败

在 Gatsby 和 Contentful 中按日期过滤

javascript gatsby / contentful - createContentTypePages

javascript Gatsby / Contentful - link.js