Я пытаюсь добавить новый шаблон в Гэтсби-стартер-герой-блог, но мой запрос 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
}
}
}
`;





Мне удалось исправить эту ошибку на основе это обсуждение.
Проблема была в gatsby-node.js. При настройке exports.createPages страницы никогда не создавались для записных книжек.
Я нахожу это конкретное сообщение об ошибке очень вводящим в заблуждение, а документация по фрагментам GraphQL очень сбивает с толку Гэтсби, учитывая, что большинство начальных блогов настроены с использованием шаблонов, которые не находятся в папках страницы / макета, которые имеют неповрежденные фрагменты GraphQL.
Так в чем же исправление? Возникла эта проблема, но предоставленная вами ссылка гласит: «Для тех, кто обнаружит это позже, проблема каким-то образом решится сама собой за выходные», что не помогает.
Ошибка действительно вводит в заблуждение. Спасибо @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.
@stagermane, не могли бы вы предоставить нам свой файл gatsby-node.js? в вашем решении нет объяснений, как и в предоставленной вами ссылке.
Я знаю, что это старый, но я также столкнулся с той же проблемой, и ответы здесь мне не помогли.
Поскольку Гэтсби использует пакет отлаживать,
что помогло мне отследить это, так это установка среды пространства имен журналирования узла отладки на 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) {...}
Я тоже получаю эту ошибку, хотя шаблон работает должным образом. Это действительно заблуждение!