javascript - 从 API 中提取文件并通过管道传输它会导致在我尝试读取它时出现文件未找到错误

标签 javascript node.js asynchronous async-await xlsx

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

const report = await getVisitorReport(visitorQueryString, 'test12.xls', uri);

let workbook = XLSX.readFile('test12.xls');

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

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 处理程序提供 resolve 函数:

.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>

关于javascript - 从 API 中提取文件并通过管道传输它会导致在我尝试读取它时出现文件未找到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52318566/

相关文章:

javascript - 如何将 jQuery 对象转换为元素?

javascript - 用于缓存的 Node.js 同步请求

javascript - 提供者和调用页面之间的异步操作架构

javascript - NodeJS - 获取二进制/位形式的缓冲区对象

ios - 异步调用后无法刷新 UI

javascript - 此 cookie 值的正则表达式?

javascript - 如何按条件取消js切换事件?

javascript - react setState 函数

javascript - 在 node.js 中验证 JWT

node.js - 如何从 NodeJS 服务器端在客户端浏览器上调用 javascript 函数?