Разрешить необязательные данные GraphQL в Gatsby для форматированного текста - PullRequest
0 голосов
/ 23 февраля 2020

Я почти могу создавать изображения баннеров Hero с различными макетами в зависимости от того, какие поля заполнены в безголовой CMS / Contentful. Я могу получать данные от конечной точки Contentful и иметь дополнительные поля для заголовков заголовков (значений sting) при предварительном определении типов для них в файле gatsby- node.js, если / когда Gatsby не находит их:

exports.createSchemaCustomization = ({ actions }) => {
  const { createTypes } = actions;
  const typeDefs = `
    type ContentfulHeroBannerSet implements Node {
      headerFirstLeft: String
      headerFirstCenter: String
      headerFirstRight: String
    }
  `;
  createTypes(typeDefs);
};

А затем проверка их существования в компонентах React отображает их, если они существуют:

 {item.node.headerRight && (
              <>
                <Container
                  item
                  xs={6}
                  spacing={3}
                  className={classes.topContainer}
                >

Теперь я добавил еще одно необязательное поле с форматированным текстом и не могу выяснить, как задать для него определение типа заранее и Gatsby не позволяет строить проект, пока он не найдет автоматически или заранее тип для subHeaderLeft. Вот запрос в Index. js:

export const pageQuery = graphql`
  query HomeQuery {
    site {
      siteMetadata {
        title
      }
    }
    allContentfulHeroBannerSet(limit: 2) {
      edges {
        node {
          headerLeft
          headerCenter
          headerRight   //So far so good
          subHeaderLeft { // Here comes the problem
            childMarkdownRemark {
              html
            }
          }

ОШИБКА: Произошла ошибка в вашем запросе GraphQL: Невозможно запросить поле "childMarkdownRemark" для типа. Рекомендуется явно введите вашу схему GraphQL, если вы хотите использовать дополнительные поля. Таким образом, вам не нужно добавлять упомянутый «фиктивный контент». Посетите наши документы, чтобы узнать, как определить схему для «contentfulHeroBannerSetSubHeaderSecondLeftRichTextNode»: https://www.gatsbyjs.org/docs/schema-customization/#creating -type-определений .

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

1 Ответ

0 голосов
/ 25 февраля 2020

попробуйте использовать вложенные типы вот так

exports.createSchemaCustomization = ({ actions }) => {
  const { createTypes } = actions;
  const typeDefs = `
    type ContentfulHeroBannerSet implements Node {
      headerFirstLeft: String
      headerFirstCenter: String
      headerFirstRight: String
      subHeaderLeft: HeroBannerSetSubHeader
    }
    type HeroBannerSetSubHeader implements Node{
      childMarkdownRemark: MarkdownRemark
    }
  `;
  createTypes(typeDefs);
};
...