Gatsby slug 没有生成正确的页面

Posted

技术标签:

【中文标题】Gatsby slug 没有生成正确的页面【英文标题】:Gatsby slug does not generate correct page 【发布时间】:2020-12-15 11:00:38 【问题描述】:

我的 gatsby slug 没有生成正确的页面 url。 它应该生成 -> /second-post-getting-started 但它正在生成 -> /second-post-getting-started/second-post-getting-started

它将 slug 添加到当前页面,而不是返回然后添加。我已经交叉检查了 gatsby-node.js 等页面但找不到错误。

这是 gatsby-node.js 代码。

 
const path = require('path')
const  slugify  = require('./src/util/utilityFunctions')
const authors = require('./src/util/authors')
const _ = require('lodash')

exports.onCreateNode = ( node, actions ) => 
 const  createNodeField  = actions
 if (node.internal.type === 'MarkdownRemark') 
   const slugFromTitle = slugify(node.frontmatter.title)
   createNodeField(
     node,
     name: 'slug',
     value: slugFromTitle,
   )
 


exports.createPages = async ( actions, graphql ) => 
 const  createPage  = actions

 // Page templates
 const templates = 
   post: path.resolve('src/templates/single-post.js'),
   postList: path.resolve('src/templates/post-list.js'),
   tag: path.resolve('src/templates/tag-posts.js'),
   tagsPage: path.resolve('src/templates/tags-page.js'),
   authorPosts: path.resolve('src/templates/author-posts.js'),
 

 const res = await graphql(`
   
     allMarkdownRemark 
       edges 
         node 
           frontmatter 
             author
             tags
           
           fields 
             slug
           
         
       
     
   
 `)

 if (res.errors) return Promise.reject(res.errors)

 // Extracting all posts from res
 const posts = res.data.allMarkdownRemark.edges

 // Create single post pages
 posts.forEach(( node ) => 
   createPage(
     path: node.fields.slug,
     component: templates.post,
     context: 
       // Passing slug for template to use to fetch the post
       slug: node.fields.slug,
       // Find author imageUrl from author array and pass it to template
       imageUrl: authors.find(x => x.name === node.frontmatter.author)
         .imageUrl,
     ,
   )
 )

 // Create posts pagination pages
 const postsPerPage = 2
 const numberOfPages = Math.ceil(posts.length / postsPerPage)

 Array.from( length: numberOfPages ).forEach((_, index) => 
   const isFirstPage = index === 0
   const currentPage = index + 1

   // Skip first page because of index.js
   if (isFirstPage) return

   createPage(
     path: `/page/$currentPage`,
     component: templates.postList,
     context: 
       limit: postsPerPage,
       skip: index * postsPerPage,
       numberOfPages: numberOfPages,
       currentPage: currentPage,
     ,
   )
 )
 // Get all tags
 let tags = []
 _.each(posts, edge => 
   if (_.get(edge, 'node.frontmatter.tags')) 
     tags = tags.concat(edge.node.frontmatter.tags)
   
 )

 let tagPostCounts =  //  tutorial: 2, design: 1
 tags.forEach(tag => 
   // Or 0 cause it might not exist yet
   tagPostCounts[tag] = (tagPostCounts[tag] || 0) + 1
 )

 // Remove duplicates
 tags = _.uniq(tags)

 // Tags page (all tags)
 createPage(
   path: '/tags',
   component: templates.tagsPage,
   context: 
     tags,
     tagPostCounts,
   ,
 )

 // Tag posts pages
 tags.forEach(tag => 
   createPage(
     path: `/tag/$_.kebabCase(tag)`,
     component: templates.tag,
     context: 
       tag,
     ,
   )
 )

 // Create author posts pages
 authors.forEach(author => 
   createPage(
     path: `/author/$slugify(author.name)`,
     component: templates.authorPosts,
     context: 
       authorName: author.name,
       imageUrl: author.imageUrl,
     ,
   )
 )


index.js 代码

       import React from "react"
import Layout from "../components/layout"
import SEO from "../components/seo"
import  graphql, StaticQuery  from "gatsby"
import Post from "../components/Post"
import PaginationLinks from '../components/PaginationLinks'

const IndexPage = () => 
  const postPerPage = 2
  let numberOfPages
  return(
  <Layout pageTitle = "Full Stack Me" 
  pageSubtitle = "Just an Encyclopedia for Web Devs" >
    <SEO title="Home" keywords=[`gatsby`, `application`, `react`] />
      <StaticQuery 
      query=indexQuery render=data => 
        numberOfPages = Math.ceil(data.allMarkdownRemark.totalCount / postPerPage)
      return(
        <div>
          data.allMarkdownRemark.edges.map(( node ) => (
            <Post  
            key=node.id 
            title=node.frontmatter.title
            author=node.frontmatter.author
            slug=node.fields.slug
            date=node.frontmatter.date
            body=node.excerpt
            fluid=node.frontmatter.images.childImageSharp.fluid
            tags=node.frontmatter.tags
            />
          ))
          <PaginationLinks currentPage=1 numberOfPages=numberOfPages/>
        </div>
      )
    
    />
  </Layout>
  )


const indexQuery = graphql`
query
  allMarkdownRemark(
    sort:  fields: [frontmatter___date], order: DESC 
    limit: 2
    ) 
    totalCount
    edges
      node
        id
        frontmatter
          title
          date(formatString: "MMM Do YYYY")
          author
          tags
          images
            childImageSharp
              fluid(maxWidth: 600)
                ...GatsbyImageSharpFluid
              
            
          
        
        fields
          slug
        
        excerpt
      
    
  

`

export default IndexPage


【问题讨论】:

您确定不只是在 html/JSX 中链接到错误的路径(例如 foo 而不是 /foo)? 我在哪里可以得到那个文件。如果你想看看这里是 git repo link 【参考方案1】:

slug 没有以正斜杠作为前缀时,您将链接到slug

<Link to=slug>/* No slash at the beginning */
  <Img className="card-image-top" fluid=fluid />
</Link>

(source)

这使它成为path-relative URL。如果您正在查看/foo/ 的页面并链接到href="bar",则完整的URL 路径将为/foo/bar。您几乎肯定希望使用绝对路径,但主机名相对 URL,您可以通过确保始终以斜杠开头的 URL 来做到这一点:

<Link to=`/$slug/`>/* With starting and trailing slashes */
  <Img className="card-image-top" fluid=fluid />
</Link>

【讨论】:

以上是关于Gatsby slug 没有生成正确的页面的主要内容,如果未能解决你的问题,请参考以下文章

在 Gatsby 中从 graphQL 查询创建 slug

盖茨比类别 slugs 在动态类别页面中不起作用

盖茨比创建页面

正确地将第二个动态模板添加到 Gatsby/NetlifyCMS - 我哪里出错了?

Gatsby `createPage` 正在生成具有相同数据的页面

使用查询变量时出现 Gatsby 运行时错误