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

Я пытаюсь вытащить удаленные изображения из моего S3 Bucket в Gatsby с помощью приведенного ниже кода. У меня есть schema.graphql, который создает классический 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,
          });
        },
      },
    },
  });
};

person rwchampin    schedule 11.07.2020    source источник
comment
Как вы создаете S3Object шрифт?   -  person ksav    schedule 12.07.2020
comment
Эта запись в блоге может быть полезна gatsbyjs.org/blog/ 2019-03-18-выпуск-настройка-новой-схемы   -  person ksav    schedule 12.07.2020
comment
googling gatsby s3 source не возвращает хороших результатов / примеров?   -  person xadm    schedule 12.07.2020


Ответы (1)


Хорошо, парни,

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

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

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

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

schema

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

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

exports.createResolvers = ({ createResolvers }) => {
  const resolvers = {
    ryanthedev_S3Object: {
      imageFile: {
        type: 'File', // this needs to be 'File', since it's not returning an 'ImageSharp' node anymore
        resolve: (source, args, context, info) => {
          // A promise is expected to be returned anyway so don't need
          // to `await` the result here, if all we're doing is returning
          // the `File` node
          return context.nodeModel.runQuery({
            query: {
              filter: {
                base: { eq: source.key },
              },
            },
            type: 'File',
            firstOnly: true,
          });
        },
      },
    },
  };
  createResolvers(resolvers);
};
person rwchampin    schedule 12.07.2020