盖茨比:如何处理siteMetadata中的未定义字段?

时间:2020-07-19 19:12:55

标签: graphql gatsby

我想基于是否定义了logo字段来构建网站标题(如果未定义,则将使用网站标题)。

gatsby-config.js:

module.exports = {
  siteMetadata: {
    title: 'Hello Web',
    logo: '/images/logo.png'
  }
}

查询:

const query = graphql`
  {
    site {
      siteMetadata {
        title
        logo
      }
    }
  }

上面的方法工作正常,但是如果我删除build breakslogo字段。

我阅读了盖茨比(Gatsby)文档上的“模式自定义”部分,但没有找到任何适用的内容(我是否遗漏了什么?)。

我当前的解决方案是将logo设置为某些“虚拟内容”。尽管它可以工作,但显然不是一个很好的解决方案,并且随着项目的发展会存在一些缺点。

截屏:

enter image description here

1 个答案:

答案 0 :(得分:1)

签出create types in this blog post.fixing fields in the the docs

createTypes可用于定义,修复或扩展表示您的某些应用数据的Gatsby GraphQL类型。可以将它视为逃生舱口,以便向盖茨比告知您数据的形状。

Gatsby根据构建时可用的数据来推断模式。如果您尝试查询不存在的字段,则会收到构建错误。

使用createTypes可以告诉盖茨比,logo字段是String类型的可空SiteSiteMetadata。现在,如果在数据源中未找到该字段,则将获得一个空值,但是gatsby可以成功构建。

// gatsby-node.js

exports.sourceNodes = ({ actions }) => {
  const { createTypes } = actions
  const typeDefs = `
    type SiteSiteMetadata implements Node {
      logo: String
    }
  `
  createTypes(typeDefs)
}

请注意,不必提供其余字段(标题,描述,作者),它们仍将由Gatsby的类型推断来处理。

enter image description here