2

我正在使用 Gatsby 构建一个博客站点,并且正在使用 Netlify CMS 来管理我的内容。每篇博文都有一个在 frontmatter 中指定的特色图片。

但是,我在显示这些图像时遇到了一些问题。我不断收到此错误:

GraphQL Error Field "image" must not have a selection since type "String" has no subfields.

我尝试添加gatsby-remark-relative-images以尝试解决此问题,但这不起作用-我仍然遇到相同的错误。

有想法该怎么解决这个吗?

目录结构

content
 - articles
public
src
static
 - admin
 - images

发布前线

---
title: Post 1
image: img.png
---

盖茨比-config.js

plugins: [
  {
    resolve: `gatsby-source-filesystem`,
    options: {
      name: `images`,
      path: `${__dirname}/static/images`,
    }
  },
  {
    resolve: `gatsby-source-filesystem`,
    options: {
      name: `content`,
      path: `${__dirname}/content`,
    }
  },
  {
    resolve: `gatsby-transformer-remark`,
    options: {
      plugins: [
        {
          resolve: `gatsby-remark-relative-images`,
        },
        {
          resolve: `gatsby-remark-images`,
          options: {
            maxWidth: 590,
          },
        },
      ],
    },
  },
  `gatsby-transformer-sharp`,
  `gatsby-plugin-sharp`,
  `gatsby-plugin-netlify-cms`,
  `gatsby-plugin-sitemap`
]

盖茨比-node.js

const path = require('path');

const { createFilePath } = require(`gatsby-source-filesystem`)
const { fmImagesToRelative } = require('gatsby-remark-relative-images');


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

  if (node.internal.type === `MarkdownRemark`) {

    const slug = createFilePath({ node, getNode, basePath: `pages` })

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

exports.createPages = ({actions, graphql}) => {
  const {createPage} = actions;

  return graphql(`{
    allMarkdownRemark {
      edges {
        node {
          html
          id
          frontmatter {
            title
            date
            templateKey
          }
          fields {
            slug
          }
        }
      }
    }
  }`)
  .then(res => {
    if (res.errors) {
      return Promise.reject(res.errors);
    }

    res.data.allMarkdownRemark.edges.forEach(({node}) => {
      createPage({
        path: node.fields.slug,
        component: path.resolve(
          `src/templates/${String(node.frontmatter.templateKey)}.js`
        ),
        context: {
          // Data passed to context is available
          // in page queries as GraphQL variables.
          slug: node.fields.slug,
        },
      })
    })

  })
}
4

4 回答 4

2

虽然@issydennis 的回答可能会有所帮助。确保三重检查您的图像路径和名称,如果您在内容定义中设置的图像与实际图像不匹配,Gatsby 将提示该错误而不是Image not found

于 2019-09-20T06:55:35.527 回答
1

尝试使用以下命令清除缓存:

gatsby clean

然后再次运行开发服务器。

使用与您相同的设置时,我经常随机收到此错误。清除缓存并重新启动通常会修复它。

于 2019-05-29T09:57:13.660 回答
1

我遵循本教程并成功使用了最新版本的 Gatsby 和 netlify。 https://blog.rousek.name/2018/08/10/cool-image-loading-with-gatsbyjs-v2-and-netlify-cms-v2/。基本上你需要使用 gatsby-plugin-netlify-cms-paths。这将允许 Graphql 能够查询图像,因为在 Netlify 上,图像字段是一种字符串。插件作者的一句话说:“一个 gatsby 插件,用于在使用 Netlify CMS 编辑它们时将 Markdown 文件中的文件路径更改为 Gatsby 友好的路径。”

或者,如果您仍然喜欢使用 gatsby-remark-relative-images,则需要添加

// gatsby-node.js
 const { fmImagesToRelative } = require('gatsby-remark-relative-images');

  exports.onCreateNode = ({ node }) => {
  fmImagesToRelative(node);
  };
于 2019-05-23T18:34:56.170 回答
1

最容易直接访问 Gatsby 文档gatsby-plugin-netlify-cms-paths

https://www.gatsbyjs.org/packages/gatsby-plugin-netlify-cms-paths/

一个警告,...您的config.yml文件应同时指定 amedia_folder和 a public_folder。但是,根据 Netlify CMS 文档:

如果未设置 public_folder,Netlify CMS 默认为与 media_folder 相同的值,如果不包含,则添加一个开头 /。

让 Netlify CMS 执行其默认操作,我在安装和配置插件后的初始 Netlify 构建失败并出现以下错误:

错误 Netlify CMS 配置中缺少 public_folder

手动添加public_folder到我的config.yml文件后,我没有进一步的问题。

于 2020-07-06T03:10:10.487 回答