【问题标题】:Returning csv data from multiple files in a directory in JavaScript从 JavaScript 目录中的多个文件返回 csv 数据
【发布时间】:2021-05-02 10:33:43
【问题描述】:

我正在尝试使用“csvtojson”从多个 CSV 文件中获取数据。

  1. 获取目录中的文件名数组。
  2. 运行 forEach 以从不同的 CSV 文件以 JSON 格式获取数据并推送到单个数组中。

问题是我无法向客户端发送数据,因为 promises 需要更长的时间来获取数据并且我无法找到方法

这是我的代码:

router.get("/covidData/", (req, res) => {
const jsonData = [];
const files = fs.readdirSync(__dirname.replace("routes", "public/covidData"));


const fetchData = () => {
  files.forEach(async (file) => {
    let response = await csvtojson({
      includeColumns: /Date Announced|Detected State|Current Status/,
    }).fromFile(__dirname.replace("routes", "public/covidData/" + file));

    jsonData.push(...response);
  });
};
fetchData();
res.send(jsonData);
});

【问题讨论】:

    标签: javascript node.js promise csvtojson


    【解决方案1】:

    您的问题是,在您尝试将数据发送回客户端之前,您需要 await所有 的承诺。您可以通过映射您的承诺然后使用await Promise.all 之前 调用res.send 来做到这一点。以下内容应该可以帮助您完成大部分工作。

    router.get("/covidData/", async (req, res) => {
      const files = fs.readdirSync(__dirname.replace("routes", "public/covidData"));
    
      const data = files.map((file) => {
        return csvtojson({
          includeColumns: /Date Announced|Detected State|Current Status/,
        }).fromFile(__dirname.replace("routes", "public/covidData/" + file));
      });
    
      const finalData = await Promise.all(data);
      res.send(finalData.flat());
    });
    

    【讨论】:

    • 您需要将forEach 替换为mapforEach 忽略返回值。 async return-await 是一种反模式。你可以简单地写const finalData = await Promise.all(files.map(f => csvtojson(...).fomrFile(...)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2011-02-06
    • 2018-10-27
    • 2019-01-31
    • 2013-05-30
    相关资源
    最近更新 更多