Gatsby-使用createRemoteFileNode获取远程图像

Jan*_*kow 2 graphql gatsby

我一直在尝试从远程URL获取图像到Gatsby Source File系统,以利用gatsby-image插件的延迟加载。我有一个宁静的API,它返回包含图像URL的字符串的json。由于我是Gatsby Node Api的新手,所以我遵循了该指南,并且不确定如何解决此问题。一切正常,直到使用添加图像的其他属性为止createNodeField。属性似乎已添加(fields当我将fileNode登录到控制台时,我可以看到带有属性的对象。但是,当尝试查询图像时,出现错误:

在此处输入图片说明

我想知道我的代码中是否有错误或者是由于gatsby的更改导致的?我正在使用gatsby版本2.0.2。是否有更好的选择以某种方式向图像添加其他属性,以便能够仅查询所需的属性?

这是我的gatsby.node.js样子:

const axios = require('axios');
const { createRemoteFileNode } = require(`gatsby-source-filesystem`);

exports.sourceNodes = ({ actions, createNodeId, node, store, cache } => {
  const { createNode, createNodeField } = actions;
  const processProject = project => {
    project.photos.forEach(async photo => {
      let fileNode;

      try {
        fileNode = await createRemoteFileNode({
          url: photo.photo.url,
          store,
          cache,
          createNode,
          createNodeId: id => `projectPhoto-${photo.id}`,
        });

        await createNodeField({
          node: fileNode,
          name: 'ProjectPhoto',
          value: 'true',
        });

        await createNodeField({
          node: fileNode,
          name: 'created_at',
          value: photo.created_at,
        });
      } catch (error) {
        console.warn('error creating node', error);
      }
    });
  }

  return axios.get(baseApiUrl).then(res => {
  res.data.forEach(project => {
     const nodeData = processProject(project);
     createNode(nodeData);
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*kow 5

最后,似乎.forEach出于某种原因,与async / await一起使用会使事情变得混乱。尽管eslint抱怨很多,但在for循环中进行所有操作可以解决问题。这是代码:

const axios = require('axios');
const { createRemoteFileNode } = require(`gatsby-source-filesystem`);

exports.sourceNodes = ({ actions, createNodeId, node, store, cache } => {
  const { createNode, createNodeField } = actions;
  const processProject = project => {
    for (const photo of project.photos) {
      let fileNode;

      try {
        fileNode = await createRemoteFileNode({
          url: photo.photo.url,
          store,
          cache,
          createNode,
          createNodeId: id => `projectPhoto-${photo.id}`,
        });

        await createNodeField({
          node: fileNode,
          name: 'ProjectPhoto',
          value: 'true',
        });

        await createNodeField({
          node: fileNode,
          name: 'created_at',
          value: photo.created_at,
        });
      } catch (error) {
        console.warn('error creating node', error);
      }
    }
  }

  return axios.get(baseApiUrl).then(res => {
  res.data.forEach(project => {
     const nodeData = processProject(project);
     createNode(nodeData);
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

  • @SakhiMansoor `export const pageQuery = graphql` query($id: String!) { ProjectImages: project(id: { eq: $id }) { childrenFile { id childImageSharp { fluid(maxWidth: 720, quality: 85) { .. .GatsbyImageSharpFluid } } } } } `;` 您可以查看 [this repo](https://github.com/janczizikow/janczizikow-portfolio) 以获取更多上下文。 (2认同)