Не удается загрузить файл с помощью graphql-upload и formik

Я пытаюсь загрузить изображение с помощью React-dropzone через Formik.

Когда я отправляю это изображение, я использую его для предварительный просмотр в img html, и это прекрасно работает.

Когда я нажимаю кнопку «Отправить», отправляется только объект предварительного просмотра, остальная информация исчезает...

Не удается загрузить файл с помощью graphql-upload и formik

Я не знаю, предназначен ли он для formik, потому что, когда я печатаю значения, он дает мне правильную информацию, но когда он отправляется, все меняется.

Вот видео об этой проблеме, и вот немного пример который удалили, ответ ниже.

Пожалуйста помоги!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
1 279
2

Ответы 2

Существует несоответствие типов между вашей операцией мутации и вашей схемой.

Операция мутации принимает значение null, а схема — нет; поэтому операция не проходит этап проверки.

Измените эту строку на Upload!: https://github.com/MontoyaAndres/bug-upload/blob/master/client/src/App.js#L8

Или измените схему на Upload, если вы хотите, чтобы файл был обнуляемым.

Потрясающий! Это работает, но... Только мне { preview: 'blob:http://localhost:3000/72474e2f-ddd3-43e1-8ea6-567714ed‌​4ad5' } отправляет, а не файл...

Andrés Montoya 06.02.2019 17:22

Я обновил репозиторий с проблемой несоответствия... Но этого недостаточно, потому что ответ - { preview: 'blob:http://localhost:3000/72474e2f-ddd3-43e1-8ea6-567714ed‌​4ad5' }, и я хочу, чтобы файл был отправлен...

Andrés Montoya 06.02.2019 17:29

Это ваш тип Mutation:

type Mutation {
  uploadFile(file: Upload!): Boolean!
}

Ваша схема определяет файл uploadFile как принимающий один аргумент с именем file типа Upload!. ! означает, что аргумент не равен нулю, т. е. значение null не может быть передано ему в качестве значения.

Это ваш запрос:

mutation UploadFileMutation($file: Upload) {
  uploadFile(file: $file)
}

Вы передаете переменную $file в аргумент file, но вы сказали GraphQL, что эта переменная имеет тип Upload, а не Upload!. Другими словами, вы говорите, что $fileмог имеет значение null. Согласно спецификации, это не проходит проверку типа.

Из спец.:

Variable usages must be compatible with the arguments they are passed to. Validation failures occur when variables are used in the context of types that are complete mismatches, or if a nullable type in a variable is passed to a non‐null argument type.

Другими словами, если поле имеет значение Upload!, вы можете использовать только те переменные, которые также определены как Upload!. Если бы поле имело тип Upload, вы могли бы передать либо Upload!, либо Upload.

TLDR; Измените свой запрос на:

mutation UploadFileMutation($file: Upload!) {
  uploadFile(file: $file)
}

или, если файл мог имеет значение null, обновите тип вашего поля, чтобы он допускал значение null.

Потрясающий! Это работает, но... Только мне { preview: 'blob:http://localhost:3000/72474e2f-ddd3-43e1-8ea6-567714ed‌​4ad5' } отправляет, а не файл...

Andrés Montoya 06.02.2019 17:22

Я обновил репозиторий с проблемой несоответствия... Но этого недостаточно, потому что ответ - { preview: 'blob:http://localhost:3000/72474e2f-ddd3-43e1-8ea6-567714ed‌​4ad5' }, и я хочу, чтобы файл был отправлен...

Andrés Montoya 06.02.2019 17:29

Это действительно должен быть отдельный вопрос, поскольку он не имеет ничего общего с ошибкой, которую вы видели. Тем не менее, вам нужно правильно настроить ваш клиент для отправки файла. Обычно это делается путем создания ссылки с аполлон-загрузить-клиент. Дополнительные сведения см. в этом проекте.

Daniel Rearden 06.02.2019 17:51

В вашем репозитории используется apollo-boost, который не включает ссылку для загрузки и не позволяет добавлять дополнительные ссылки. Вам нужно будет перейти на apollo-client (apollographql.com/docs/react/advanced/boost-migration.html) и добавить ссылку для загрузки из apollo-upload-client.

Daniel Rearden 06.02.2019 18:14

Другие вопросы по теме