Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用管道从异步等待https请求生成文件_Javascript_Node.js_Rest - Fatal编程技术网

Javascript 使用管道从异步等待https请求生成文件

Javascript 使用管道从异步等待https请求生成文件,javascript,node.js,rest,Javascript,Node.js,Rest,在这些文档和一天的研究之后,我尝试使用pipe来组装一个由API调用返回的Excel电子表格。我在保存它的中途,但文件已损坏: async function getWeeklyReport(queryString) { return new Promise((resolve, reject) => { request({ url: 'https://reports.myApi.com/ReportCenter/Bookings', qs: queryString, header

在这些文档和一天的研究之后,我尝试使用pipe来组装一个由API调用返回的Excel电子表格。我在保存它的中途,但文件已损坏:

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已创建,但文件已损坏。谢谢

有官方的
请求承诺
消除了对样板承诺构造函数的需要

它要么是控制流,要么是流。承诺的使用导致一次获得整个响应,因此不需要流。它也可以立即写入:

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);
}

您什么时候读取文件?您混合了许多异步主题,但它们没有正确混合。您正在通过
异步
函数手动返回
承诺
(该函数将自动将返回打包为
承诺
),但您也在返回可管道流。