Жалобы на запросы GraphQL в нестраничном компоненте для сайта GatsbyJS

Я пытаюсь добавить новый шаблон в Гэтсби-стартер-герой-блог, но мой запрос 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 - это новый шаблон, который я добавляю (для рендеринга записных книжек Jupyter с использованием плагина Nteract Gatsby).

Синтаксис моего добавленного шаблона запроса идентичен синтаксису других шаблонов (и у меня есть образец записной книжки в содержимом, которое отображается в GraphiQL).

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

Я даже попытался создать шаблон barebones с простым запросом, отражающим один из других шаблонов (даже попробовав точную копию шаблона с измененными именами компонентов), и все еще получаю то же предупреждение (и, следовательно, отсутствие рендеринга записной книжки. Например, , у 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
      }
    }
  }
`;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
4
0
3 268
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Мне удалось исправить эту ошибку на основе это обсуждение.

Проблема была в gatsby-node.js. При настройке exports.createPages страницы никогда не создавались для записных книжек.

Я нахожу это конкретное сообщение об ошибке очень вводящим в заблуждение, а документация по фрагментам GraphQL очень сбивает с толку Гэтсби, учитывая, что большинство начальных блогов настроены с использованием шаблонов, которые не находятся в папках страницы / макета, которые имеют неповрежденные фрагменты GraphQL.

Я тоже получаю эту ошибку, хотя шаблон работает должным образом. Это действительно заблуждение!

protoEvangelion 06.10.2018 23:04

Так в чем же исправление? Возникла эта проблема, но предоставленная вами ссылка гласит: «Для тех, кто обнаружит это позже, проблема каким-то образом решится сама собой за выходные», что не помогает.

Ambroise Rabier 03.12.2019 11:45

Ошибка действительно вводит в заблуждение. Спасибо @stagermane, предоставленная вами ссылка мне помогла. В моем каталоге шаблонов был файл, который не использовался и экспортировал запрос страницы. Я исправил проблему, удалив запрос страницы. Меня поразило, когда я прочитал этот комментарий по ссылке Note to my future self: This error is common when the template is not actually used; a bug in page generation (eg. in gatsby-node.js) will cause it. The instructions in the error are misleading.

Peter Umoren 11.02.2020 12:24

@stagermane, не могли бы вы предоставить нам свой файл gatsby-node.js? в вашем решении нет объяснений, как и в предоставленной вами ссылке.

Uj Corb 04.12.2020 23:12

Я знаю, что это старый, но я также столкнулся с той же проблемой, и ответы здесь мне не помогли.

Поскольку Гэтсби использует пакет отлаживать, что помогло мне отследить это, так это установка среды пространства имен журналирования узла отладки на gatsby:query-watcher, как указано в query-watcher.ts.

Если кто-то еще заглушает это, просто запустите свой сервер разработки таким образом, и это должно помочь вам легче отследить его:

env "NODE_ENV=development" "DEBUG=gatsby:query-watcher" npm run dev

Я следил за этим Руководство по блогу Gatsby, когда столкнулся с подобной проблемой. Я дошел до той части, где добавил код для 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 я больше не получал вышеуказанное предупреждение. Но когда я попытался перейти к сообщению в блоге, Гэтсби сказал, что не может получить доступ к значению свойства markdownRemark.

Итак, я раскомментировал весь код postQuery в файле blogPost.js. Затем после сохранения файла все просто заработало. Предупреждение больше не появляется, и я мог без проблем переходить к созданным мной сообщениям в блоге.

Я знаю, это не имеет смысла. Но моя проблема исправлена ​​после того, как я прокомментировал и раскомментировал код, в котором был запрос graphql.

Для меня проблема действительно заключалась в gatsby-node.js (функция createPages), как упоминается в stagermane, однако причина моей неудачи в том, что allMarkdownRemark имел ограничение в 1000, а теперь у меня более 1000 страниц.

Я просто изменил его на более высокое число, в данном случае 5000, как показано ниже, и это сработало!

allMarkdownRemark (ограничение: 5000) {...}

Другие вопросы по теме