未被捕获的TypeError:无法使用Gatsby和graphQl读取未定义的属性“数据”

时间:2018-10-12 12:58:15

标签: javascript reactjs graphql graphql-js gatsby

我正在第一次测试Gatsby和GraphQl,并且正在尝试一个简单的示例。...

当我想通过GraphQl请求在布局中显示标题时出现此错误? :未捕获的TypeError:无法读取未定义的属性'site'

这是我的布局:

import React from 'react'
import { graphql } from 'gatsby'

export default ({ children, data  }) =>
  <div style={{margin: 'auto', maxWidth: 760}}>
  <h2>{data.site.siteMetadata.title}</h2>
  {children}
  <footer>
    Copyright blablb abolajoa.
  </footer>
</div>

export const query = graphql`
query LayoutQuery {
  site {
    siteMetadata {
      title
    }
  }
}
`

和我的gatsby-config.js:

module.exports = {
  siteMetadata: {
    title: `Hardcoders`
  },
  plugins: [
    {
      resolve: 'gatsby-plugin-typography',
      options: {
        pathToConfigModule: 'src/utils/typography.js'
      }
    },
  ]
}  

这是项目的配置:

"dependencies": {
    "gatsby": "^2.0.0",
    "gatsby-plugin-typography": "^2.2.0",
    "react": "^16.5.1",
    "react-dom": "^16.5.1",
    "react-typography": "^0.16.13",
    "typography": "^0.16.17",
    "typography-theme-github": "^0.15.10"
  }

知道什么在干扰吗?

2 个答案:

答案 0 :(得分:3)

在盖茨比,我知道2种graphql查询类型,即页面查询和静态查询。

页面查询 这些通常包含在src/pages文件夹下的组件文件的底部。查询结果将自动传递到其相应页面组件的props.data属性。 https://www.gatsbyjs.org/docs/page-query/

静态查询 这些是使用StaticQuery组件创建的,该组件可以包含在任何React组件中(也就是不仅仅在src / pages文件夹下)。 https://www.gatsbyjs.org/docs/static-query/

对于您而言,这听起来像是您尝试在非页面组件中进行页面查询,该组件不会自动分配给数据道具。您可以尝试将查询移动到占用Layout的任何页面组件中,也可以通过StaticQuery组件将其转换为静态查询。

例如在src / pages / index.jsx

export default ({ data }) => (
    <Layout data={data}>
    </Layout>
);

export const query = graphql`
  query LayoutQuery {
    site {
      siteMetadata {
        title
      }
    }
  }
}

答案 1 :(得分:0)

尝试一下。基本上,我们需要在访问嵌套键之前先对其进行检查

 <h2>{data && data.site && data.site.siteMetadata && data.site.siteMetadata.title}</h2>

 <h2>{data && data['site'] && data.site['siteMetadata'] && data.site.siteMetadata['title']}</h2>