使用管道从异步等待 https 请求构建文件



根据文档和一天的研究,我正在尝试使用管道来组装由 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 已创建,但文件已损坏。谢谢!

有官方request-promise消除了对样板承诺构造函数的需求。

它要么是承诺控制流,要么是流。使用 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);
}

最新更新