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

Graphql 盖茨比:如何处理siteMetadata中未定义的字段?,graphql,gatsby,Graphql,Gatsby,我想根据是否定义了logo字段来构建站点标题(如果未定义,将使用站点标题) gatsby config.js: module.exports={ 站点元数据:{ 标题:“你好,网络”, logo:“/images/logo.png” } } 查询: const query=graphql` { 场地{ 站点元数据{ 标题 标志 } } } 上面的操作很好,但是如果我删除徽标字段 我阅读了盖茨比文档中的模式定制部分,但没有找到任何适用的内容(我是否遗漏了什么?) 我目前的解决方案是将logo设

我想根据是否定义了
logo
字段来构建站点标题(如果未定义,将使用站点标题)

gatsby config.js:

module.exports={
站点元数据:{
标题:“你好,网络”,
logo:“/images/logo.png”
}
}
查询:

const query=graphql`
{
场地{
站点元数据{
标题
标志
}
}
}
上面的操作很好,但是如果我删除
徽标
字段

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

我目前的解决方案是将
logo
设置为一些“虚拟内容”。虽然它可以工作,但它显然不是一个优雅的解决方案,随着项目的发展,它也有一些缺点

屏幕截图:

签出并删除

createTypes
可用于定义、修复或扩展表示某些应用程序数据的Gatsby GraphQL类型。把它想象成一个逃生舱,礼貌地告诉盖茨比你的数据的形状

盖茨比根据构建时可用的数据推断模式。如果您试图查询一个不存在的字段,您将得到一个生成错误

使用
createTypes
可以告诉盖茨比
logo
字段是
sitematadata
类型上的可为空的
String
。现在,如果在您的数据源中找不到该字段,您将得到一个空值,但是盖茨比可以成功地构建它

// gatsby-node.js

exports.sourceNodes = ({ actions }) => {
  const { createTypes } = actions
  const typeDefs = `
    type SiteSiteMetadata implements Node {
      logo: String
    }
  `
  createTypes(typeDefs)
}
请注意,其余字段(标题、描述、作者)不必提供,它们仍将由盖茨比的类型推断处理