GatsbyJS网站的非页面组件中的GraphQL查询投诉

时间:2018-08-18 20:54:59

标签: reactjs jupyter-notebook graphql graphql-js gatsby

我正在尝试向gatsby-starter-hero-blog添加新模板,但是我对新模板的GraphQL查询被拒绝:

warning The GraphQL query in the non-page component 
"/Users/mc/workspaces/mc/src/templates/NoteBookTemplate.js" will not be run.
Queries are only executed for Page or Layout components. Instead of a query,
co-locate a GraphQL fragment and compose that fragment into the query (or other
fragment) of the top-level page or layout that renders this component. 
For more
info on fragments and composition see: 
http://graphql.org/learn/queries/#fragments

文件夹结构如下:

--src
  --components
  --images
  --pages
  --templates
    --CategoryTemplate.js
    --NotebookTemplate.js
    --PageTemplate.js
    --PostTemplate.js     
  --theme
  --utils

NotebookTemplate.js是我要添加的新模板(用于使用Nteract的Gatsby插件渲染Jupyter笔记本)。

我添加的模板查询的语法与其他模板相同(并且在内容中确实有一个示例笔记本,在GraphiQL中可见)。

export const query = graphql`
  query NotebookQuery($slug: String!) {
    jupyterNotebook(fields: { slug: { eq: $slug } }) {
      html
      internal {
        content
      }
    }
  }
` 

我什至尝试使用镜像其他模板之一的简单查询来创建准系统模板(甚至尝试使用组件名称已更改的模板的精确副本),但仍收到相同的警告(随后未渲染笔记本)例如,PageTemplate.js具有以下查询(对gatsby构建没有任何抱怨)。

export const pageQuery = graphql`
  query PageByPath($slug: String!) {
    page: markdownRemark(fields: { slug: { eq: $slug } }) {
      id
      html
      frontmatter {
        title
      }
    }
    site {
      siteMetadata {
        facebook {
          appId
        }
      }
    }
  }
`;

为什么文件中的这些查询不在页面或布局文件夹中也不会引发此错误?还有其他文件可以解决吗? FWIW,这是我要实现的实际模板。

import React from 'react'
import PropTypes from "prop-types";
import 'katex/dist/katex.min.css'
import { ThemeContext } from "../layouts";

const NotebookTemplate = ({ data }) => {
  const post = data.jupyterNotebook
  const notebookJSON = JSON.parse(post.internal.content)
  return (
    <React.Fragment>
        <p>
          This notebook is displayed in the <strong>client-side</strong> using
          react component
          <code>NotebookPreview</code>
          from
          <a href="https://github.com/nteract/nteract/tree/master/packages/notebook-preview">
            <code>@nteract/notebook-preview</code>.
          </a>
        </p>
        <NotebookPreview notebook={notebookJSON} />
    </React.Fragment>
  );
};

NotebookTemplate.propTypes = {
  data: PropTypes.object.isRequired
};

export default NotebookTemplate;

export const query = graphql`
  query NotebookQuery($slug: String!) {
    jupyterNotebook(fields: { slug: { eq: $slug } }) {
      html
      internal {
        content
      }
    }
  }
`;

3 个答案:

答案 0 :(得分:3)

我能够根据this discussion.

修复此错误

问题出在gatsby-node.js中。设置exports.createPages的方式从未为笔记本创建页面。

我确实发现此特定错误消息非常容易引起误解,并且考虑到大多数入门博客都使用不在具有完整GraphQL片段的页面/布局文件夹中的模板设置,因此GraphQL片段的文档对于Gatsby而言非常令人困惑。

答案 1 :(得分:0)

当我遇到类似问题时,我正在关注此 Gatsby Blog tutorial。我到了向 gatsby-node.js 添加代码的部分。保存文件后,我希望能够浏览到我的博客文章,但我收到了以下警告:

The GraphQL query in the non-page component "C:/GitRepos/gatsby-blog-starter/src/templates/blogPost.js" will not be run.

就我而言,该解决方案没有任何意义,但我在这里分享它,因为它确实为我解决了问题。

我所做的是在 postQuery 文件中注释掉 graphql 的整个代码,其中包含 blogPost.js 查询。保存文件并运行 gatsby develop 后,我不再收到上述警告。但是当我尝试导航到博客文章时,Gatsby 说它无法访问属性 markdownRemark 的值。

因此,我取消了 postQuery 文件中 blogPost.js 的全部代码的注释。然后保存文件后,一切正常。警告不再出现,我可以导航到我创建的博客文章,没有任何问题。

我知道,这没有意义。但是在注释和取消注释包含 graphql 查询的代码后,我的问题得到了解决。

答案 2 :(得分:0)

对我来说,问题确实出在 stagermane 提到的 gatsby-node.js(createPages 函数)中,但是我失败的原因是 allMarkdownRemark 的限制为 1000,而我现在有 1000 多页。

我只是将其更改为更高的数字,在本例中为 5000,如下所示,并且成功了!

allMarkdownRemark(limit: 5000) {...}