#reactjs #graphql #gatsby
#reactjs #graphql #gatsby
Вопрос:
Цель
Привет. У меня есть веб-сайт Gatsby, и я использую gatsby-transformer-remark
плагин для загрузки файлов уценки блога из каталога блога в GraphQL для отображения на моем сайте. Я просмотрел документы и пример кода, чтобы узнать, как создать slug для каждой страницы, чтобы в gatsby-node.js
файле я мог динамически создавать страницы с slug.
Проблема
Когда я пытаюсь получить доступ к fields { slug }
свойству в GraphiQL, я получаю следующую ошибку: message": "Cannot query field "fields" on type "MarkdownRemark"."
я проверил свои настройки пару раз, и я думаю, что все кажется хорошим, поэтому я не уверен на 100%, что я пропустил, чтобы не иметь этих полей. Я могу получить доступ к другой информации, такой как необработанное содержимое файлов markdown и данные frontmatter, но не к полям.
Код
В моих gatsby-config.js
плагинах у меня есть следующие настройки для исходной файловой системы и плагина remark
{
resolve: `gatsby-source-filesystem`,
options: {
name: `blog`,
path: `${__dirname}/blog`,
},
},
{
resolve: `gatsby-transformer-remark`,
options: {
plugins: [
{
resolve: `gatsby-remark-images`,
options: {
maxWidth: 960,
},
},
`gatsby-remark-prismjs`,
`gatsby-remark-copy-linked-files`,
],
},
},
Как только я нахожусь в GraphiQL, я запускаю следующий запрос для репликации ошибки
query {
allMarkdownRemark(
sort: { fields: [frontmatter___date], order: DESC }
limit: 1000
) {
edges {
node {
fields {
slug
}
frontmatter {
title
}
}
}
}
}
Ответ №1:
Как вы можете видеть, slug
field не является дочерним элементом frontmatter
(как должно быть изначально, если вы работаете с необработанными уценками). Чтобы сделать slug
доступный как дочерний элемент field
, вам необходимо добавить следующий фрагмент в свой gatsby-node.js
:
const { createFilePath } = require(`gatsby-source-filesystem`)
exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions
if (node.internal.type === `MarkdownRemark`) {
const slug = createFilePath({ node, getNode, basePath: `pages` })
createNodeField({
node,
name: `slug`,
value: slug,
})
}
}
Добавляя эту конфигурацию с createNodeField
помощью API, вы разрешаете Gatsby и предполагаемой схеме GraphQL создавать дополнительные поля на узлах, созданных другими плагинами, сообщая Gatsby, что если тип узла является markdown, создайте slug
поле на основе slug
значения frontmatter
.
Дополнительную информацию вы можете найти в документах Gatsby’s docs.
Комментарии:
1. Большое вам спасибо, я знал, что это будет что-то незначительное, что было упущено из виду. Этот случай на некоторое время поставил меня в тупик