Разрешить необязательные данные GraphQL в Гэтсби - PullRequest
3 голосов
/ 18 февраля 2020

Я пытаюсь создать тип в моем файле gatsby-node.js, который поддерживает необязательное значение. Что, я думаю, сделано с [String!]!.

Как я могу загрузить новый тип, который я создал внутри gatsby-node.js на home.js?

Гэтсби - node.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);
};

страниц / дома / дома. js:

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

home.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.
---

Это необходимо для работы так что если массив features внутри фронта home.md пуст, то GraphQL не выдаст ошибку.

Пожалуйста, не говорите мне всегда включать хотя бы одно значение в массив Поскольку это непрактично, мое решение не должно поддерживать никаких значений в моем массиве.

Я потратил два часа на изучение документации / проблем в кругах, пытаясь найти рабочее решение, пожалуйста, кто-нибудь может спасти меня !

1 Ответ

2 голосов
/ 19 февраля 2020

Из документов GraphQL :

  • String! означает, что поле не имеет значения , что означает, что служба GraphQL обещает всегда давать вам значение, когда вы запрашиваете это поле. На языке типов мы будем представлять те, у кого восклицательный знак .
  • [Episode!]! представляет массив Episode объектов. Так как он также не может обнуляться, вы всегда можете ожидать массив (с нулевым или большим количеством элементов) при запросе поля. А поскольку Episode! также не может обнуляться, вы всегда можете ожидать, что каждый элемент массива будет Episode объектом.

Восклицательный знак ! в GraphQL означает ненулевое значение , поэтому [String!]! означает, что существует ненулевой массив ненулевых строк.

Если вы хотите, чтобы поле было необязательным, просто оставьте его как есть без восклицательные знаки !. Например, [String] означает, что массив может быть нулевым, или любое из строковых значений внутри него может быть нулевым.

Я также не уверен, что вы хотите использовать массив в первую очередь, поскольку title и description объекта должны быть просто одной строкой?

В соответствии с документами Gatsby , я думаю, что вы ищете это:

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, которое может быть нулевым (необязательным) и, если оно существует, является массивом Feature объектов. Он может быть пустым, но если существуют какие-либо Feature объекты, каждый Feature имеет пустое (необязательное) поле title и description.

...