如何修复NetlifyCMS构建上的“ TypeError:childImageSharp未定义”?

如何解决如何修复NetlifyCMS构建上的“ TypeError:childImageSharp未定义”?

我正在现有的gatsby网站上建立一个简单的博客页面,我希望使用netlify cms的人能够上传该博客文章的缩略图。我设法做到了,并使用graphigl定位了它

graphiql screenshot

现在我想将其设置到我的博客文章页面:

def table(n):
    for limit in range(1,n+1):    
        s = ""
        for i in range(1,limit):
            for j in range(1,limit):
                s += f"{i*j}\t"
            s += "\n"

        print(s)
table(6)

#1  

#1  2   
#2  4   

#1  2   3   
#2  4   6   
#3  6   9   

#1  2   3   4   
#2  4   6   8   
#3  6   9   12  
#4  8   12  16  

#1  2   3   4   5   
#2  4   6   8   10  
#3  6   9   12  15  
#4  8   12  16  20  
#5  10  15  20  25  

然后在netlify上重新部署时出现这些错误。

netlify build error

config.yml

import React from "react"
import { Link,graphql,useStaticQuery } from "gatsby"

import Layout from "../components/layout/layout"

const Blog = () => {
  const data = useStaticQuery(graphql`
    query {
      allMarkdownRemark {
        edges {
          node {
            frontmatter {
              title
              date
              thumbnail {
                childImageSharp {
                  fluid(maxWidth: 400) {
                    src
                  }
                }
              }
            }
            fields {
              slug
            }
          }
        }
      }
    }
  `)

  return (
    <>
      <Layout>
        <main className="main">
          <div className="articles">
            <h1 className="articles__title">Articles</h1>
            {data.allMarkdownRemark.edges.map(edge => {
              return (
                <section className="articles__list">
                  <a className="articles__article">
                    <div className="articles__article-artwork">
                      <figure className="articles__article-artwork-wrapper">
                        {edge.node.frontmatter.thumbnail.childSharpImage.fluid.src}
                      </figure>
                    </div>
                    <h2 className="articles__article-title">
                      <Link to={`/blog/${edge.node.fields.slug}`}>
                        {edge.node.frontmatter.title}
                      </Link>
                    </h2>
                    <Link>
                      <p>{edge.node.frontmatter.date}</p>
                    </Link>
                    <div className="articles__article-description">
                      <p></p>
                    </div>
                    <span className="articles__article-more">Read more...</span>
                  </a>
                </section>
              )
            })}
          </div>
        </main>
      </Layout>
    </>
  )
}
export default Blog

gatsby-node.js

backend:
  name: github
  branch: development
  repo: (removed for work reasons)

media_folder: static/img
public_folder: img

collections:
  - name: "blog"
    label: "Blog"
    folder: "src/posts"
    create: true
    slug: "{{slug}}"
    fields:
      - {label: "Layout",name: "layout",widget: "hidden",default: "blog"}
      - {label: "Title",name: "title",widget: "string"}
      - {label: "Publish Date",name: "date",widget: "datetime"}
      - {label: "Body",name: "body",widget: "markdown"}
      - {label: "Image",name: "thumbnail",widget: "image"}

gatsby-config.js

const path = require('path')

module.exports.onCreateNode = ({ node,actions }) => {
    const { createNodeField } = actions

    if (node.internal.type === "MarkdownRemark") {
        const slug = path.basename(node.fileAbsolutePath,'.md')

        createNodeField({
            node,name: 'slug',value: slug
        })
    }
}

module.exports.createPages = async ({ graphql,actions}) => {
    const { createPage } = actions
    const blogTemplate = path.resolve('./src/templates/blog.js')
    const res = await graphql(`
        query {
            allMarkdownRemark {
                edges {
                    node {
                        fields {
                            slug
                        }
                    }
                }
            }
        }
    `)

    res.data.allMarkdownRemark.edges.forEach((edge) => {
        createPage({
            component: blogTemplate,path: `/blog/${edge.node.fields.slug}`,context: {
                slug: edge.node.fields.slug
            }
        })
    })
}

老实说,使用netlify cms向我现有的gatsby网站添加博客页面会很容易,但这一直是我尝试过的最困难的事情之一。

非常感谢您的帮助。

谢谢

解决方法

我有些奇怪的事情。

  • 您的查询无法正常工作(因此,破坏了代码),因为它找不到您的图片。将您的config.yml媒体路径更改为:

      media_folder: static/img
      public_folder: /img
    

    请注意/路径中的斜杠(public_folder)。

    这是因为它是相对路径,必须以斜杠开头。 From Netlify docs(斜杠部分):

公共文件夹

此设置为必需。

public_folder选项指定文件所在的文件夹路径 相对于基础,将访问媒体库上传的内容 建造场所。对于[file]或[image]小部件控制的字段, 该字段的值是通过将该路径添加到 所选文件的文件名。默认为media_folder的值, 如果没有一个/,则以空缺开头

   public_folder: "/images/uploads"

根据上述设置,如果用户使用了图像小部件字段 称为avatar以上传并选择名为philosoraptor.png的图像, 图像将保存到存储库中 /static/img/philosoraptor.png,以及 文件将设置为/img/philosoraptor.png

您的media_folder看起来不错。

  • <figure>标签内渲染图像的方式。按照您的方法,它将渲染带有图像路径的字符串,但是,您使用的是gatsby-image中的锐笔,但您没有使用它。在一些试验中,我建议进行以下操作:

    <figure>
       <Img fluid={edges.node.frontmatter.thumbnail.childImageSharp.fluid}>
    </figure>
    

    按照gatsby-image方法,您还应该使用类似以下的查询片段:

       const data = useStaticQuery(graphql`
      query {
        allMarkdownRemark {
          edges {
            node {
              frontmatter {
                title
                date
                thumbnail {
                  childImageSharp {
                    fluid(maxWidth: 400) {
                      ...GatsbyImageSharpFluid
                    }
                  }
                }
              }
              fields {
                slug
              }
            }
          }
        }
      }
    `)
    

    注意...GatsbyImageSharpFluid片段以获取使用gatsby-image所需的所有数据。

  • 您正在使用staticQuery,但您不需要它,因为所有数据都来自CMS。您应该使用page/template query来提高性能,但这会改变您的页面结构。

    在Gatsby中创建动态页面的“标准”方法是使用gatsby-node.js使用createPage API,将所需的数据传递到模板(通常是id或{{1 }}),并使用该唯一数据来检索博客/帖子信息。

    您正在通过上下文传递slug,但从未使用过:

    slug

    此外,您还会使用静态查询( context: { slug: edge.node.fields.slug } )遍历所有文章,这是没有意义的,浪费时间和性能。

    您的allMarkdownRemark模板应类似于:

    Blog

    请注意,您将传递子段( import React from 'react' import { graphql } from 'gatsby' const Blog = ({data}) => { return ( <div> Blog title is: {data.markdownRemark.frontmatter.title} </div> ) } export const query = graphql` query BlogQuery($slug: String!) { query { markdownRemark(fields: { slug: { eq: $slug }}) { html frontmatter { title date thumbnail { childImageSharp { fluid(maxWidth: 400) { ...GatsbyImageSharpFluid } } } } fields { slug } } } } ` export default Blog )作为必需参数($slug),因此页面查询不能为null。之后,您将过滤markdown节点(String!),以获得与您在markdownRemark文件中传递的上下文匹配的节点。换句话说,在这种情况下,您拥有每个帖子的数据。

    还要注意,您可能需要更改查询以匹配您的数据结构,我已经从头开始发布了它,但不知道您的字段。使用gatsby-node.js(GraphQL游乐场)进行检查。由于这是GraphQL的局限性,因此您的片段无法在其中使用,但可以在您的代码上使用,因此请避免在此处使用它,而将其保留在您的代码中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res