我对我的盖茨比网站有个问题。我从内容中获取内容,根据gatsby-node.js中的代码,它必须生成两个页面,但当我单击其中的第二个页面时,只有其中一个在工作。
在/second%20post还没有一页
我很困惑,因为这里询问的大多数问题都告诉我们,它们无法生成页面,我不知道是否创建了页面,如果创建了页面,那么为什么它会显示错误消息,以及当到达错误页时,
第二员额
链接是给定的,但它是不可点击的。所有其他代码都在Github码的git存储库中。
请愿书指的是图像,以便在像在这里中理解清楚。
这是我的gatsby-node.js代码文件。
const path = require(`path`)
exports.createPages = async ({ graphql, actions, reporter }) => {
const { createPage } = actions;
// Define a template for blog post
const blogPost = path.resolve(`./src/templates/blog-post-contentful.js`)
// Get all markdown blog posts sorted by date
const result = await graphql(
`
{
allContentfulBlockchainlearning{
edges{
node{
slug
title
subtitle
}
}
}
}
`
)
if (result.errors) {
reporter.panicOnBuild(
`There was an error loading your blog posts`,
result.errors
)
return
}
const posts = result.data.allContentfulBlockchainlearning.edges
// Create blog posts pages
// But only if there's at least one markdown file found at "content/blog" (defined in gatsby-
config.js)
// `context` is available in the template as a prop and as a variable in GraphQL
if (posts.length > 0) {
posts.forEach((post, index) => {
const previousPostSlug = index === 0 ? null : posts[index - 1].id
const $nextPostSlug = index === posts.length - 1 ? null : posts[index + 1].id
createPage({
path: post.node.slug,
component: blogPost,
context: {
slug: post.node.slug,
previousPostSlug,
$nextPostSlug,
},
})
})
}
}这是我想要创建的博客帖子模板
import React from "react"
import { Link, graphql } from "gatsby"
import Bio from "../components/bio"
import Layout from "../components/layout"
import SEO from "../components/seo"
const BlogPostTemplate = ({ data, location }) => {
const post = data.contentfulBlockchainlearning
const siteTitle = data.site.siteMetadata?.title || `Title`
const { previous, next } = data
return (
<Layout location={location} title={siteTitle}>
<SEO
title={post.title}
description={post.subtitle}
/>
<article
className="blog-post"
itemScope
itemType="http://schema.org/Article"
>
<header>
<h1 itemProp="headline">{post.title}</h1>
<p>{post.date}</p>
</header>
<section
dangerouslySetInnerHTML={{ __html: post.content.raw }}
itemProp="articleBody"
/>
<hr />
<footer>
<Bio />
</footer>
</article>
<nav className="blog-post-nav">
<ul
style={{
display: `flex`,
flexWrap: `wrap`,
justifyContent: `space-between`,
listStyle: `none`,
padding: 0,
}}
>
<li>
{previous && (
<Link to={previous.slug} rel="prev">Hey There
← {previous.title}
</Link>
)}
</li>
<li>
{next && (
<Link to={next.slug} rel="next">
{next.title} →
</Link>
)}
</li>
</ul>
</nav>
</Layout>
)
}
export default BlogPostTemplate
export const pageQuery = graphql`
query BlogPostBySlug(
$slug: String!
$previousPostSlug: String
$nextPostSlug: String
) {
site {
siteMetadata {
title
}
}
contentfulBlockchainlearning(slug: {eq: $slug}){
title
subtitle
content{
raw
}
}
previous: contentfulBlockchainlearning(slug: { eq: $previousPostSlug}) {
title
}
next: contentfulBlockchainlearning(slug: { eq: $nextPostSlug }) {
title
}
}
`发布于 2021-01-09 11:21:35
问题很简单,您不能像您试图创建的那样创建一个带有空格的URL。second page应该被解析为second-page,因为second和page之间的空格可能会导致很多问题。
盖茨比正在正确地创建这些页面,因为它们出现在404页上(在gatsby develop下,404页列出了您创建的所有页面)。然而,它没有一个有效的路线,因为你的鼻涕虫必须被毁损。理想情况下,应该从CMS获取正确的格式,但是,您可以添加一些控件以避免这种行为:
if (posts) {
posts.forEach((post, index) => {
let slugifiedPath= post.node.slug.toLowerCase().replace(/\s/g, '-');
const previousPostSlug = index === 0 ? null : posts[index - 1].id
const $nextPostSlug = index === posts.length - 1 ? null : posts[index + 1].id
createPage({
path: slugifiedPath,
component: blogPost,
context: {
slug: post.node.slug,
previousPostSlug,
$nextPostSlug,
},
})
})
}这是非常不言自明的,但是,由于您的路径是用错误的格式获取的,所以您需要通过以下方法重构它们:
let slugifiedPath= post.node.slug.toLowerCase().replace(/\s/g, '-');它将其转换为小写,并使用连字符(-)的正则表达式替换全局所有空白(-),从而创建一个有效的段塞。
https://stackoverflow.com/questions/65636521
复制相似问题