Kie*_*son 4 reactjs graphql gatsby
你好。我有一个 Gatsby 网站,我正在使用该gatsby-transformer-remark插件将博客 Markdown 文件从博客目录加载到 GraphQL 中以显示在我的网站上。我查看了文档和示例代码,了解如何为每个页面创建一个 slug,以便在文件中gatsby-node.js我可以动态地使用该 slug 创建页面。
当我尝试访问fields { slug }GraphiQL 中的属性时,出现以下错误:
message": "Cannot query field \"fields\" on type \"MarkdownRemark\"."我已经检查了我的设置几次,我认为一切看起来都很好,所以我不能 100% 确定我错过了没有这些字段的内容。我可以访问其他信息,例如 markdown 文件的原始内容和 frontmatter 数据,但不能访问字段。
在我的gatsby-config.js插件中,我对源文件系统和备注插件进行了以下设置
{
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`,
],
},
},
Run Code Online (Sandbox Code Playgroud)
进入 GraphiQL 后,我运行以下查询来复制错误
query {
allMarkdownRemark(
sort: { fields: [frontmatter___date], order: DESC }
limit: 1000
) {
edges {
node {
fields {
slug
}
frontmatter {
title
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,slugfield 不是 的子项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,
})
}
}
Run Code Online (Sandbox Code Playgroud)
使用createNodeFieldAPI 添加此配置,您将允许 Gatsby 和推断的 GraphQL 模式在其他插件创建的节点上创建其他字段,方法是告诉 Gatsby 如果节点类型是 markdown,则slug根据.slugfrontmatter
您可以在Gatsby 的文档中查看更多信息。
| 归档时间: |
|
| 查看次数: |
1176 次 |
| 最近记录: |