Javascript 使用管道从异步等待https请求生成文件
在这些文档和一天的研究之后,我尝试使用pipe来组装一个由API调用返回的Excel电子表格。我在保存它的中途,但文件已损坏: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
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);
}
您什么时候读取文件?您混合了许多异步主题,但它们没有正确混合。您正在通过
异步
函数手动返回承诺
(该函数将自动将返回打包为承诺
),但您也在返回可管道流。