te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>javascript - How to allow optional sharp image in graphql gatsby? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to allow optional sharp image in graphql gatsby? - Stack Overflow

programmeradmin1浏览0评论

I typically have frontmatter that will have an array of objects, inside each object will be an image which will reference a string of a file relative to the markdown file.

The problem is, the array could sometimes be empty, meaning graphql will have to work out what the schema is by setting all the values to non-null, I have been able to do this with simple types such as strings using Gatsby's createSchemaCustomization, but I want to be able to declare a string that references an image to use Image Sharp (so gatsby-transformer-sharp can press the image before the ponent receives it).

It doesn't seem like anywhere on the Gatsby documentation or image sharp plugin that there is a schema type for this.

I tried using File! as a type which works when the array is empty but when you actually try to reference real images it simply returns { image: childImageSharp: null } meaning gatsby-transformer-sharp doesn't run on them like it does when File! isn't decalared.

Below is how my schema has been declared:

exports.createSchemaCustomization = ({ actions }) => {
    const { createTypes } = actions;
    const typeDefs = `
        type MarkdownRemark implements Node {
            frontmatter: Frontmatter
        }
        type Frontmatter {
          features: [Feature!]!
        }
        type Feature {
            title: String!
            description: String!
            image: File!
        }
    `;

    createTypes(typeDefs);
};

This is my graphql query:

export const query = graphql`
    query HomeQuery($path: String!) {
        markdownRemark(frontmatter: { path: { eq: $path } }) {
            html
            frontmatter {
                features {
                    title
                    description
                    image {
                        childImageSharp {
                            fluid(maxWidth: 800) {
                                ...GatsbyImageSharpFluid
                            }
                        }
                    }
                }
            }
        }
    }
`;

And my markdown file which returns the array of objects of features, image being the string which should create a fluid image sharp object.

---
path: '/'
features:
    - title: Barns
      description: Praesent modo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
      image: features-001.png
    - title: Private Events
      description: Praesent modo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
      image: features-002.png
    - title: Food and Drinks
      description: Praesent modo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
      image: features-003.png
    - title: Spa
      description: Praesent modo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
      image: features-004.png
---

As an overview, as soon as I remove the File! on the createSchemaCustomization all the images show up, but the build will break as soon as the array is empty.

I typically have frontmatter that will have an array of objects, inside each object will be an image which will reference a string of a file relative to the markdown file.

The problem is, the array could sometimes be empty, meaning graphql will have to work out what the schema is by setting all the values to non-null, I have been able to do this with simple types such as strings using Gatsby's createSchemaCustomization, but I want to be able to declare a string that references an image to use Image Sharp (so gatsby-transformer-sharp can press the image before the ponent receives it).

It doesn't seem like anywhere on the Gatsby documentation or image sharp plugin that there is a schema type for this.

I tried using File! as a type which works when the array is empty but when you actually try to reference real images it simply returns { image: childImageSharp: null } meaning gatsby-transformer-sharp doesn't run on them like it does when File! isn't decalared.

Below is how my schema has been declared:

exports.createSchemaCustomization = ({ actions }) => {
    const { createTypes } = actions;
    const typeDefs = `
        type MarkdownRemark implements Node {
            frontmatter: Frontmatter
        }
        type Frontmatter {
          features: [Feature!]!
        }
        type Feature {
            title: String!
            description: String!
            image: File!
        }
    `;

    createTypes(typeDefs);
};

This is my graphql query:

export const query = graphql`
    query HomeQuery($path: String!) {
        markdownRemark(frontmatter: { path: { eq: $path } }) {
            html
            frontmatter {
                features {
                    title
                    description
                    image {
                        childImageSharp {
                            fluid(maxWidth: 800) {
                                ...GatsbyImageSharpFluid
                            }
                        }
                    }
                }
            }
        }
    }
`;

And my markdown file which returns the array of objects of features, image being the string which should create a fluid image sharp object.

---
path: '/'
features:
    - title: Barns
      description: Praesent modo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
      image: features-001.png
    - title: Private Events
      description: Praesent modo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
      image: features-002.png
    - title: Food and Drinks
      description: Praesent modo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
      image: features-003.png
    - title: Spa
      description: Praesent modo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
      image: features-004.png
---

As an overview, as soon as I remove the File! on the createSchemaCustomization all the images show up, but the build will break as soon as the array is empty.

Share Improve this question edited Apr 2, 2020 at 12:37 Joe Methven asked Feb 19, 2020 at 15:43 Joe MethvenJoe Methven 5285 silver badges16 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 22 +50

After months of on and off searching I managed to work it out, I was correct by using the File type, the reason it was returning empty on images that did exist is that I was missing the ever-special directive @fileByRelativePath.

For all those that are struggling with this, you must have an exported function called createSchemaCustomization in your gatsby-node.js, from here you must configure your frontmatter properties that you would like to provide the non-null values on.

exports.createSchemaCustomization = ({ actions, schema }) => {
    const { createTypes } = actions;

    const typeDefs = [
        `type MarkdownRemark implements Node {
            frontmatter: Frontmatter
        }`,
        `type Frontmatter @infer {
            about_hero_slides: [File!]! @fileByRelativePath,
            about_title: String,
            about_text: String,
            about_images: [File!]! @fileByRelativePath,
        }`,
    ];

    createTypes(typeDefs);
};

Once I added in @infer on the Frontmatter type and @fileByRelativePath to each File property it instantly resolved any images, and all images that didn't exist would simply return null instead of throwing an error!

发布评论

评论列表(0)

  1. 暂无评论