javascript - gatsby-node 没有构建标签页面
问题描述
我正在尝试使用本教程为来自 gatsbyjs.org的博客帖子创建标签页面来实现该网站博客的标签。复制并粘贴 /templates/tags.js 和 /pages/tags.js,仅使用指南建议的部分代码编辑 gatsby-node.js。我这样做是因为我已经在使用不同的代码以编程方式生成博客文章页面。整个repo 可以在这里找到。
问题是有一个页面可以显示由 graphQL 收集的所有标签,但根本没有页面可以显示带有此类标记的帖子。第一个中的链接将您带到默认的 404 页面。我不确定有什么问题。
/templates/tags.js
import React from "react"
import PropTypes from "prop-types"
// Components
import { Link, graphql } from "gatsby"
const Tags = ({ pageContext, data }) => {
const { tag } = pageContext
const { edges, totalCount } = data.allMarkdownRemark
const tagHeader = `${totalCount} post${
totalCount === 1 ? "" : "s"
} tagged with "${tag}"`
return (
<div>
<h1>{tagHeader}</h1>
<ul>
{edges.map(({ node }) => {
const { slug } = node.fields
const { title } = node.frontmatter
return (
<li key={slug}>
<Link to={slug}>{title}</Link>
</li>
)
})}
</ul>
{/*
This links to a page that does not yet exist.
You'll come back to it!
*/}
<Link to="/tags">All tags</Link>
</div>
)
}
Tags.propTypes = {
pageContext: PropTypes.shape({
tag: PropTypes.string.isRequired,
}),
data: PropTypes.shape({
allMarkdownRemark: PropTypes.shape({
totalCount: PropTypes.number.isRequired,
edges: PropTypes.arrayOf(
PropTypes.shape({
node: PropTypes.shape({
frontmatter: PropTypes.shape({
title: PropTypes.string.isRequired,
}),
fields: PropTypes.shape({
slug: PropTypes.string.isRequired,
}),
}),
}).isRequired
),
}),
}),
}
export default Tags
export const pageQuery = graphql`
query($tag: String) {
allMarkdownRemark(
limit: 2000
sort: { fields: [frontmatter___date], order: DESC }
filter: { frontmatter: { tags: { in: [$tag] } } }
) {
totalCount
edges {
node {
fields {
slug
}
frontmatter {
title
}
}
}
}
}
`
看一下 /templates/tags.js 文件,有一段代码说 这链接到一个尚不存在的页面。你会回来的!这使我认为缺少某些东西,也许在另一个指南中,但我并没有真正设法找到或意识到它是什么。
盖茨比-node.js
const path = require(`path`)
const _ = require("lodash")
exports.createPages = async ({ actions, graphql, reporter }) => {
const { createPage } = actions
const blogPostTemplate = path.resolve(`src/templates/blogPost.js`)
const tagTemplate = path.resolve(`src/templates/tags.js`)
const result = await graphql(`
{
allMarkdownRemark(
sort: { order: DESC, fields: [frontmatter___date] }
limit: 1000
) {
edges {
node {
fields {
slug
}
frontmatter {
tags
}
}
}
}
tagsGroup: allMarkdownRemark(limit: 2000) {
group(field: frontmatter___tags) {
fieldValue
}
}
}
`)
// Handle errors
if (result.errors) {
reporter.panicOnBuild(`Error while running GraphQL query.`)
return
}
// Extract blog data from query
const blogPage = result.data.allMarkdownRemark
blogPage.edges.forEach(({ node }) => {
createPage({
path: `/blog/${_.kebabCase(node.fields.slug)}`,
component: blogPostTemplate,
context: {}, // additional data can be passed via context
})
})
// Extract tag data from query
const tags = result.data.tagsGroup.tagsGroup
// Make tag pages
tags.forEach(tag => {
createPage({
path: `/tags/${_.kebabCase(tag.fieldValue)}/`,
component: tagTemplate,
context: {
tag: tag.fieldValue,
},
})
})
}
我已经调用了 allMarkdownRemark.edges.node.frontmatter.tags,因为它在指南中被调用。不确定它的去向,因为它没有在此代码中的任何地方引用,但我相信它用于构建标签页面。
任何意见、提示、请求和帮助将不胜感激。感谢您的阅读!
解决方案
在你的gatsby-node.js
替换:
// Extract tag data from query
const tags = result.data.tagsGroup.tagsGroup
和:
const tags = result.data.tagsGroup.group
您的 Graphql 查询正在查询:
tagsGroup: allMarkdownRemark(limit: 2000) {
group(field: frontmatter___tags) {
fieldValue
}
}
因此,您感兴趣的数据位于tagsGroup.group
. 通过此更改,您的构建工作正常并且页面生成正确。您可以通过导航到 来测试它localhost:8000/tags
。
推荐阅读
- google-sheets - 忽略空单元格的 ImportRange 函数
- reactjs - 使用 setInterval 动态改变图像
- python - == 或 != 在链式比较中是否有用?
- azure-cosmosdb - Azure Cosmos DB Mongo API 存储过程
- android - FirebaseUI 导入:库 com.google.android.gms:play-services-basement 正在被其他各种库请求
- java - 错误:Java:无效的目标版本:11 - IntelliJ IDEA
- python - 如何使用 Selenium 和 BeautifulSoup 从标签中获取文本
- python - 在 django admin 上注册 4 个参数 - TypeError: register() 最多接受 3 个参数(给定 4 个)
- json - 如何使用法拉第的 post 方法将 JSON 作为表单数据发送
- reactjs - this.setState 不会更新状态,除非我将整个对象传递给它