Использование pipe для создания файла из асинхронного запроса https - PullRequest
0 голосов
/ 28 августа 2018

После документов и ежедневных исследований я пытаюсь использовать конвейер для сборки электронной таблицы Excel, возвращаемой вызовом API. Я частично сохраняю его, но файл поврежден:

async function getWeeklyReport(queryString) {
return new Promise((resolve, reject) => {
request({
  url: 'https://reports.myApi.com/ReportCenter/Bookings',
  qs: queryString,
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Basic ' + new Buffer(process.env.apiEmail + ':' + process.env.apiPassword, 'utf8').toString('base64')
  }
}, (error, response, body) => {
  if (error) {
    reject(error);
  } else {
    if (response.statusCode === 200) {
      resolve(body);
    } else if (response.statusCode === 409) {
      setTimeout(() => {
        resolve(getWeeklyReport(queryString));
      }, response.headers['Retry-After'] * 1000);
    } else {
      reject(response);
    }
  }
}).pipe(fs.createWriteStream('test3.xlsm'));

}); }

Что я здесь не так делаю? test3 создан, но файл поврежден. Спасибо!

1 Ответ

0 голосов
/ 28 августа 2018

Существует официальный request-promise, который устраняет необходимость в стандартных конструкторах обещаний.

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

const request = require('request-promise');
const { writeFile } = require('fs').promises;

async function getWeeklyReport(queryString) {
  let result;
  const response = await request({..., resolveWithFullResponse: true });

  if (response.statusCode === 200) {
    result = response.body;
  } else if (response.statusCode === 409) {
    await new Promise(resolve => setTimeout(resolve, response.headers['Retry-After'] * 1000));
    result = await getWeeklyReport(queryString);
  } else {
    throw response;
  }

  await writeFile('test3.xlsm', result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...