Gatsby createSchemaCustomization добавляет настраиваемое поле для каждого узла - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над плагином gatsby для других интерфейсов gatsby, который извлекает данные Contentful с помощью graphql.
Я расширяю createSchemaCustomization API, потому что я хотел бы добавить новое поле (скажем contentful_id) для каждого узла.

Graphql позволяет обновлять запрос по шаблону посетителя, поэтому я прикрепляю поле contentful_id к каждому узлу graphql, а в плагине gatsby-node.js я добавлял этот преобразователь (setFieldsOnGraphQLNodeType, но он устарел) в это поле, чтобы, если узел graphql не смог найти contentful_id, он не взорвался.

exports.setFieldsOnGraphQLNodeType = () => {
  return {
    contentful_id: {
      type: GraphQLString,
      resolve: (source) => {
        return source.contentful_id || '';
      },
    },
  };
};

Кроме того, я не знаю, сколько узлов каждый интерфейс gatsby

Я хотел бы получить следующее
Для всех типов, сгенерированных в каждом интерфейсе gatsby, добавьте новое поле String с именем contentful_id

1 Ответ

1 голос
/ 27 мая 2020

Я работаю над плагином Gatsby, который извлекает данные Contentful с помощью GraphQL.

То, что вы создаете, называется исходным плагином .

Обычно случается, что вы реализуете API Gatsby sourceNodes. Вот пример, адаптированный из документов :

// first, you'll need to source from Contentful
const { getContentfulNode, getContentfulId } = require("./get-contentful-node.js")

exports.sourceNodes = ({ actions, createNodeId, createContentDigest }) => {
  const { createNode } = actions

  const nodeData = getContentfulNode()
  const contentfulId = getContenfulId()

  const node = {
    ...nodeData,
    contentful_id // this is where you add your field to the node
    // node metadata
    id: createNodeId(`my-data-${myData.key}`),
    parent: null,
    children: [],
    internal: {
      type: `MyNodeType`,
      mediaType: `text/html`,
      content: JSON.stringify(nodeData),
      contentDigest: createContentDigest(myData)
    }
  }

  const node = Object.assign({}, myData, nodeMeta)
  createNode(node)
}

Если вы уже получили узлы, но хотите добавить к ним дополнительное поле вне sourceNodes , я бы использовал API onCreateNode. Вы можете проверить, имеет ли узел тип ContentfulNode (например), и добавить к нему поле, если это так.

...