Как переслать файл, полученный из API, с помощью Node.js / Express - PullRequest
0 голосов
/ 28 апреля 2020

Редактировать : не дубликат Передача удаленного файла в ExpressJS. В указанном вопросе удаленный файл доступен через URL и метод GET. Это не тот случай, я получаю файл в ответном сообщении после POST запроса.

У меня есть веб-интерфейс, позволяющий пользователю загрузить документ. По несвязанным причинам этот документ генерируется внешней службой каждый раз, когда пользователь запрашивает его (на основе некоторых контекстных данных). Таким образом, конвейер выглядит следующим образом:

  1. Ссылка на пользовательский клик в переднем конце
  2. Отправка внешнего интерфейса GET Запрос к концу
  3. back-end get соответствующих внутренних данных и отправьте запрос POST на внешний API
  4. Внешний API отправляет ответ, содержащий саму do c с соответствующими заголовками content-disposition=attachment и content-type и документ в теле ответ.
  5. Мой бэкэнд перенаправляет его во внешний интерфейс
  6. Пользователю предлагается ссылка для скачивания

Шаги с 1 по 4 работают. В чем моя проблема :

  • Пользователю предлагается всплывающее окно загрузки, файл имеет правильный тип (pdf в моем примере), но файл pdf пустая страница
  • Если я отправлю тот же запрос, что и мой бэкэнд, на внешний API, но через почтальона, я получу нужный файл с нужным содержимым.
  • Если я отправлю тот же запрос, что и мой интерфейс к бэкэнду, но через почтальона я также получаю пустой файл pdf.

Я предполагаю, что я не правильно перенаправляю ответ от внешнего API на интерфейс.

Мой код:

function getDocFromExternalApi(req, res) {
    sendMyRequest().then(externalApiResponse => {
        res.status(200).header({ //headers appears to be what is expected
            'content-disposition': externalApiResponse.headers['content-disposition'], //= 'attachement; filename="someFileName.pdf"'
            'content-type': externalApiResponse.headers['content-type'] // = 'application/pdf'
        }).send(externalApiResponse.data) //externalApiResponse.data contains the file
    })
}

Я также попытался добавить кодировку к content-type и соответствующий заголовок content-length, но также без кубиков.

Полный ответ из внешнего API: https://pastebin.com/5FX72eAX

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...