Я пытаюсь загрузить изображение с помощью React-dropzone через Formik.
Когда я отправляю это изображение, я использую его для предварительный просмотр в img html, и это прекрасно работает.
Когда я нажимаю кнопку «Отправить», отправляется только объект предварительного просмотра, остальная информация исчезает...
Я не знаю, предназначен ли он для formik, потому что, когда я печатаю значения, он дает мне правильную информацию, но когда он отправляется, все меняется.
Вот видео об этой проблеме, и вот немного пример который удалили, ответ ниже.
Пожалуйста помоги!





Существует несоответствие типов между вашей операцией мутации и вашей схемой.
Операция мутации принимает значение 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-567714ed4ad5' }, и я хочу, чтобы файл был отправлен...
Это ваш тип 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-567714ed4ad5' } отправляет, а не файл...
Я обновил репозиторий с проблемой несоответствия... Но этого недостаточно, потому что ответ - { preview: 'blob:http://localhost:3000/72474e2f-ddd3-43e1-8ea6-567714ed4ad5' }, и я хочу, чтобы файл был отправлен...
Это действительно должен быть отдельный вопрос, поскольку он не имеет ничего общего с ошибкой, которую вы видели. Тем не менее, вам нужно правильно настроить ваш клиент для отправки файла. Обычно это делается путем создания ссылки с аполлон-загрузить-клиент. Дополнительные сведения см. в этом проекте.
В вашем репозитории используется apollo-boost, который не включает ссылку для загрузки и не позволяет добавлять дополнительные ссылки. Вам нужно будет перейти на apollo-client (apollographql.com/docs/react/advanced/boost-migration.html) и добавить ссылку для загрузки из apollo-upload-client.
Потрясающий! Это работает, но... Только мне
{ preview: 'blob:http://localhost:3000/72474e2f-ddd3-43e1-8ea6-567714ed4ad5' }отправляет, а не файл...