Это не может быть сделано только мутацией.
Вы не можете вернуть файл (двоичный файл) / заголовки (mime) / et c (необходимо обрабатывать браузером как запрос на загрузку) используя json 'ed связь. Запрос и ответ GraphQL имеют формат json.
Решение
Рабочий процесс:
- вызов мутации (передача параметра в переменные)
- resolver создает содержимое файла и сохраняет его где-то (хранилище файлов на сервере или s3)
- resolver возвращает файл
id
, который будет частью URL-адреса загрузки, или полный url
(строка) в целевой файл
id
или url
в этом случае должен быть частью требуемого ответа мутации
mutation ($reportId: Int!) {
createPdf (reportId: $reportId){
reportDownloadId
}
}
- результат мутации (и наш
reportDownloadId
) доступен в data
data
(результат / ответ) от мутации можно получить двумя способами:
... по { data }
:
const [addTodo, { data }] = useMutation(ADD_TODO);
... или обработчиком onCompleted
:
addTodo({
variables: { type: input.value },
onCompleted = {(data) => {
// some action with 'data'
// f.e. setDownloadUrl(data.reportDownloadId)
// from 'const [downloadUrl, setDownloadUrl] = useState(null)'
}}
});
Оба метода описаны в документах
Оба метода позволят вам (условно) отобразить кнопку загрузки / link / component, fe
{downloadUrl && <DownloadRaport url={downloadUrl}/>}
{downloadUrl && <a href={downloadUrl}>Raport ready - download it</a>}
// render download, share, save in cloud, etc.
Метод обработчика может использоваться для автоматического вызова запроса загрузки файла , без визуализации нг дополнительная кнопка. Это будет выглядеть как одно действие, а технически есть два следующих запроса (мутация и загрузка graphql). В этой ветке описывается, как обрабатывать загрузки, используя js.
.