Gatsby `S3Object`, которого нет в схеме. Используйте createTypes для добавления типа перед добавлением преобразователей - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь извлечь удаленные изображения из моего S3 Bucket в Gatsby с помощью приведенного ниже кода. У меня есть schema.graphql, который создает classi c S3Object. Но узел Gatsby выдает следующую ошибку. Я уже несколько дней занимаюсь этой проблемой в документации, может ли кто-нибудь указать мне в правильном направлении? Мне просто нужно загрузить изображение на уровень данных Gatsby, чтобы я мог использовать Gatsby-image.

У меня такое чувство, что мне нужно обновить S3Object, чтобы расширить интерфейс узла, я работаю над этим сейчас .

Ошибка:

warn `createResolvers` passed resolvers for type `S3Object` that doesn't exist in the schema. Use `createTypes` to add the type before adding resolvers.

schema.graphql

type PortfolioItem @model @key(fields: ["title", "createdAt"]) {
  id: ID!
  title: String!
  file: S3Object
  thumbnailUrl: String
  ...
}

type S3Object {
  bucket: String!
  key: String!
  region: String!
}

gatsby- node.js

exports.createResolvers = ({ actions, cache, createNodeId, createResolvers, store, reporter }) => {
  const { createNode } = actions;
  createResolvers({
    S3Object: {
      imageFile: {
        type: `File`,
        resolve(source, args, context, info) {
          return createRemoteFileNode({
            url: 'https://my-aws-bucket-url.s3.us-east-2.amazonaws.com/' + source.key,
            store,
            cache,
            createNode,
            createNodeId,
            reporter,
          });
        },
      },
    },
  });
};

1 Ответ

0 голосов
/ 12 июля 2020

Хорошо, ребята,

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

Вся цель здесь заключалась в том, чтобы иметь прямой доступ к удаленному изображению в поле модели в graphql НЕПОСРЕДСТВЕННО. Никакого зацикливания на длинных массивах изображений из какого-то запроса Gatsby listAllImages и подобной чепухи. Это добавляет фактический ИСПОЛЬЗУЕМЫЙ GATSBY-IMAGE прямо в поле вашей модели, которое будет использоваться немедленно.

  1. Определите S3Object в вашем Schema.Graphql, как показано ниже.
type S3Object {
  bucket: String!
  key: String!
  region: String!
}
Ответ здесь - создание настраиваемого преобразователя в вашем файле узла gatsby. И уловка здесь заключается в том, чтобы войти в схему уровня Гэтсби и увидеть НАСТОЯЩЕЕ имя вашей модели. Это секрет. Вам нужно запустить:
gatsby repl

Это переведет вас в интерфейс командной строки Gatsby, а затем введите:

schema

ЭТО ПОКАЖЕТ ВАМ НАЗВАНИЯ УРОВНЕЙ Скомпилированной схемы. Итак, ваш S3Object на самом деле называется _s3object. Используя это имя, к которому, по-видимому, было добавлено ваше имя api .... smfh .... должен использоваться с настраиваемым преобразователем с запросом gql внутри него для добавления файла в вашу модель. Увидеть ниже. Теперь, когда бы вы ни добавили S3Object в качестве типа поля, у вас будет доступ к изображению с помощью запроса четкости изображения! Вы также должны использовать gatsby-s3-image-source для захвата всех изображений, которые будут использоваться в вашей файловой системе!

Это было очень сложное решение для нуб, как я, Гэтсби, я надеюсь, что это решит проблему с удаленным файлом, как у меня!

...