从 API 中提取文件并对其进行管道处理会导致在我尝试读取文件时出现"找不到文件"错误



我正在从API中提取一个Excel文件,需要使用xlsx库读取和修改它。我正在使用节点 8.10 并为此异步/等待:

const report = await getVisitorReport(visitorQueryString, 'test12.xls', uri);
let workbook = XLSX.readFile('test12.xls');

这是函数getVisitorReport。请注意,我解决了管道完成时的承诺:

async function getVisitorReport(queryString, reportPath, uri) {
return new Promise((resolve, reject) => {
request({
url: uri,
qs: queryString,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password, 'utf8').toString('base64')
}
}, (error, response, body) => {
if (error) {
reject(error);
} else {
if (response.statusCode === 200) {
resolve(body);
} else if (response.statusCode === 409) {
setTimeout(() => {
resolve(getVisitorReport(queryString));
}, response.headers['Retry-After'] * 1000);
} else {
reject(response);
}
}
}).pipe(fs.createWriteStream(reportPath)).on('finish', resolve(reportPath));
});
}

文件已正确拉取和创建。似乎第二行XLSX.readFile('test12.xls'(发生在文件在本地保存之前。我在这里做错了什么?如何确保在尝试读取文件之前已保存文件?为什么 .pipe.on('finish', resolve( 没有完成此操作? 感谢您的帮助!

代码立即调用resolve.on('finish', resolve(reportPath))

您可以将解析函数直接提供给on处理程序:

.on('finish', resolve)

或者,如果需要传递一些数据,请使用箭头函数:

.on('finish', () => resolve(args))

编辑:

如果你这样做:.on('finish', resolve(reportPath))它大致等于

resolve(reportPath); // immediately calls resolve which makes a promise resolved 
// so await doesn't stop the further code execution
....on('finish', undefined)

为了更好地理解,请看这个例子:

const [bad, good] = document.querySelectorAll("button");
bad.addEventListener("click", console.log("I log immediately when the page loads and not at click event"))
good.addEventListener("click", () => console.log("I log properly when button is clicked"))
<button>broken button</button>
<button>good button</button>

相关内容

最新更新