Как исправить ошибки инвариантного нарушения при запуске сборки / разработки Gatsby

Я использую node v16.0.0, Gatsby v3.6.1 и Yarn v1.22.10 в качестве диспетчера зависимостей с плагинами:

Я использовал следующую функцию в файле gatsby-node.js для создания узлов в GraphQL с изображениями, которые можно запросить позже:

// gatsby-node.js
const { createRemoteFileNode } = module.require(`gatsby-source-filesystem`)

exports.onCreateNode = async ({   node,
  actions: { createNode },
  store,
  cache,
  createNodeId,
 }) => {
  if (node.internal.type === `API__images` && node.pk) {
    let fileNode = await createRemoteFileNode({
      url: node.url, // string that points to the URL of the image
      parentNodeId: node.id, // id of the parent node of the fileNode you are going to create
      createNode, // helper function in gatsby-node to generate the node
      createNodeId, // helper function in gatsby-node to generate the node
      cache, // Gatsby's cache
      store, // Gatsby's Redux store
    })
    // if the file was created, attach the new node to the parent node
    if (fileNode) {
      node.image___NODE = fileNode.id
    }
  }
}

Кажется, что это нормально работает при запуске gatsby develop или gatsby build, но если я попытаюсь снова запустить любую из этих команд (с теми же исходными данными), возникает следующая ошибка:

Missing onError handler for invocation 'building-schema', 
error was Invariant Violation: Encountered an error 
trying to infer a GraphQL type for: `image___NODE`. 
There is no corresponding node with the `id` field matching: 

"27564a59-be49-51fb-98d6-c32de4f2030c",
"379357c0-1faa-5177-806d-7f155f2e3e85",

...

Эти 27564a59-b.., 379357c0-1.. - это идентификаторы узлов изображения, которые были созданы функцией gatsby-node.js.

Если я запустил gatsby clean, он будет работать нормально, но использование gatsby clean - не лучшее решение, потому что очистка кеша нарушит инкрементные сборки.

Кто-нибудь знает, как исправить эту ошибку? я должен использовать фиксированные идентификаторы для узлов?

Ошибка трассировки:

(/my-project/node_modules/invariant/invariant.js:40:15)
    at getFieldConfigFromFieldNameConvention (/my-project/node_modules
/gatsby/src/schema/infer/add-inferred-fields.js:227:3)
    at getFieldConfig (/my-project/node_modules/gatsby/src/schema/infe
r/add-inferred-fields.js:129:19)
    at forEach (/my-project/node_modules/gatsby/src/schema/infer/add-i
nferred-fields.js:79:25)
    at Array.forEach (<anonymous>)
    at addInferredFieldsImpl (/my-project/node_modules/gatsby/src/sche
ma/infer/add-inferred-fields.js:63:28)
    at addInferredFields (/my-project/node_modules/gatsby/src/schema/i
nfer/add-inferred-fields.js:27:3)
    at addInferredType
(/my-project/node_modules/gatsby/src/schema/infer/index.js:101:3)
    at map
(/my-project/node_modules/gatsby/src/schema/infer/index.js:65:5)
    at Array.map (<anonymous>)
    at addInferredTypes
(/my-project/node_modules/gatsby/src/schema/infer/index.js:64:23)
    at updateSchemaComposer
(/my-project/node_modules/gatsby/src/schema/schema.js:169:9)
    at buildSchema
(/my-project/node_modules/gatsby/src/schema/schema.js:64:3)
    at build
(/my-project/node_modules/gatsby/src/schema/index.js:105:18)
    at buildSchema
(/my-project/node_modules/gatsby/src/services/build-schema.ts:19:3)'

person Ander    schedule 31.05.2021    source источник
comment
Вы в конце концов поняли это?   -  person Kevmon    schedule 15.06.2021
comment
Не совсем, я пробовал использовать фиксированные идентификаторы с createNodeId: id => Image${node.pk}, но все равно выдает инвариантную ошибку.   -  person Ander    schedule 21.06.2021


Ответы (1)


Кажется, это довольно свежая тема в этой ветке GitHub.

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

Кроме того, попробуйте удалить все свои node_modules и заблокированные зависимости:

rm -rf node_modules && rm -rf package-lock.json

Чтобы сделать новую установку.


В соответствии с предложенной ошибкой я бы попытался обернуть создание вашего узла в _3 _ / _ 4_:

// gatsby-node.js
const { createRemoteFileNode } = module.require(`gatsby-source-filesystem`)

exports.onCreateNode = async ({   node,
  actions: { createNode },
  store,
  cache,
  createNodeId,
 }) => {
  let fileNode;
 try{
  if (node.internal.type === `API__images` && node.pk) {
    fileNode = await createRemoteFileNode({
      url: node.url, // string that points to the URL of the image
      parentNodeId: node.id, // id of the parent node of the fileNode you are going to create
      createNode, // helper function in gatsby-node to generate the node
      createNodeId, // helper function in gatsby-node to generate the node
      cache, // Gatsby's cache
      store, // Gatsby's Redux store
    })
  } catch (e) {
      console.log(e)
    }
    // if the file was created, attach the new node to the parent node
    if (fileNode) {
      node.image___NODE = fileNode.id
    }
  }
}

Я знаю, что вы сказали, что запуск gatsby clean не вариант, но когда вы меняете основные узлы, вы можете быть вынуждены запустить один. Как только ваш проект будет готов (первая сборка), следующие сборки получат и будут использовать ваш кеш.

person Ferran Buireu    schedule 31.05.2021
comment
Я уже использую Yarn в качестве диспетчера зависимостей @Ferran Buireu (я обновил вопрос). Я попробовал ваше предложение на всякий случай, но не устранил проблему. Возникла та же ошибка, но все равно спасибо, ваши комментарии в Stackoverflow сэкономили мне много времени во многих случаях. - person Ander; 31.05.2021
comment
Спасибо за ответ :). Я удалю ответ, если не предоставлю какое-либо полезное решение. На всякий случай ... вы пробовали обновить версию Node? Похоже, вы используете старую версию (последняя LTS - 14.17). - person Ferran Buireu; 31.05.2021
comment
да, извините, я использую узел v16.0.0, по ошибке поставил npm --version - person Ander; 31.05.2021
comment
Вы пробовали обернуть создание узла в _1 _ / _ 2_? (из-за onError)? - person Ferran Buireu; 31.05.2021
comment
Вы пробовали использовать фиксированные идентификаторы? - person Ferran Buireu; 31.05.2021
comment
Используется createNodeId: id => 'Image${node.image_id}' для определения фиксированных идентификаторов, но выдается такая же ошибка: There is no corresponding node with the "id" field matching: "Image95,Image96 ... - person Ander; 21.06.2021