5

我正在尝试在我的gatsby-node.js文件中构建一个支持可选值的类型。我认为已经完成了[String!]!

如何加载我在里面创建的新gatsby-node.js类型home.js

盖茨比节点.js:

const path = require('path');
exports.createSchemaCustomization = ({ actions }) => {
    const { createTypes } = actions;
    const typeDefs = `
        type markdownRemark implements Node {
            frontmatter: Features
        }
        type Features {
            title: [String!]!
            description: [String!]!
        }
    `;
    createTypes(typeDefs);
};

页面/主页/home.js:

export const query = graphql`
    query HomeQuery($path: String!) {
        markdownRemark(frontmatter: { path: { eq: $path } }) {
            html
            frontmatter {
                features {
                    title
                    description
                }
            }
        }
    }
`;

主页.md:

---
path: "/"
features:
    - title: Barns
      description: Praesent commodo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
    - title: Private Events
      description: Praesent commodo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
    - title: Food and Drinks
      description: Praesent commodo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
    - title: Spa
      description: Praesent commodo cursus magna vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit.
---

这需要起作用,以便如果 's front matter 中的features数组home.md为空,则 GraphQL 不会引发错误。

请不要告诉我总是在数组中包含至少一个值,因为这不切实际,我的解决方案需要在我的数组中不支持任何值。

我花了两个小时在圈子里浏览文档/问题,试图找到一个可行的解决方案,请有人救我!

4

1 回答 1

5

来自GraphQL 文档

  • String!表示该字段不可为空,这意味着 GraphQL 服务承诺在您查询该字段时始终为您提供一个值。在类型语言中,我们将用感叹号表示那些
  • [Episode!]!Episode表示对象数组。由于它也是不可为空的,因此当您查询该字段时,您总是可以期待一个数组(包含零个或多个项目)。而且由于Episode!也是不可为空的,因此您始终可以期望数组的每个项目都是一个Episode对象。

!GraphQL 中的感叹号表示non-nullable,因此[String!]!表示存在一个非空字符串的非空数组。

如果您希望某个字段是可选的,请保持原样,不要使用感叹号!。例如[String]表示数组可以为空,或者其中的任何字符串值都可以为空。

我也不确定您是否首先要使用数组,因为title一个description功能肯定应该只是一个字符串?

根据Gatsby docs,我认为您正在寻找的是:

const typeDefs = `
    type markdownRemark implements Node {
        // Use custom frontmatter type
        frontmatter: Frontmatter
    }
    // Define custom frontmatter type
    type FrontMatter {
      // Nullable array of Feature elements
      features: [Feature]
    }
    // Feature has nullable fields title and description
    type Feature {
        title: String
        description: String
    }
`;

这意味着 frontmatter 有一个名为的字段,该字段features可以为 null(可选),如果确实存在,则它是一个Feature对象数组。它可以为空,但如果Feature存在任何对象,则每个对象Feature都有一个可为空的(可选)titledescription字段。

于 2020-02-18T21:14:30.517 回答