【问题标题】:Writing data to multiple files in for loop using Node.js使用 Node.js 在 for 循环中将数据写入多个文件
【发布时间】:2018-08-08 20:52:57
【问题描述】:

在我当前的项目中,我正在通过 API 读取数据,我希望每个设备都有多个文件(我有大约 100 个设备),对于每个设备,我想创建 .csv 文件,写入多行到文件(使用节点csv-write-stream 包)并关闭文件。同样,我想对每 100 个设备执行相同的操作。我尝试了以下代码,但出现以下错误:

结束后写

   var csvWriter = require('csv-write-stream');
   var writer = csvWriter({ headers: ["TimeStamp", "Gas","gw_temp","rh","abrasion","sensor_temp"]});
      for(let j=0;j<data.length;j++){
      // Create file for each devices
       await writer.pipe(fs.createWriteStream(data[j][0] + '.csv',{flags:"a"}));
       // Get data through API
       await axios.get([API CALL URL].join('/'), getConfig)
        .then(async (response) => {
          let res = await response.data;
           if(res.length!=0){
           for (let i = 0; i < res.length; i++) {
              // Write data to csv file
              await  writer.write(res[i]);
           }
          }
        })
        .catch((error) => {
          if (error.response) {
            console.log("Error in response", error.message);
          } else {
            console.log("Other error", error.message);
          }
        });
        await writer.end(); 
        await console.log("File writing done",data[j][0]);
       }
      }

看起来我错过了一件小事,但我无法识别它。

我也参考了这个链接:"Error: write after end" with csv-write-stream

更新 如果我删除 catch 块,则会引发以下错误:

(node:13264) UnhandledPromiseRejectionWarning: E​​rror: write after end 在 writeAfterEnd (_stream_writable.js:236:12) 在 CsvWriteStream.Writable.write (_stream_writable.js:287:5)

【问题讨论】:

  • 你为什么要结合async/await.then/.catch?同样,在let res = await response.data; 行上,response.data 真的是一个承诺吗?
  • async/await 是为了执行承诺,catch 是从 API 捕获错误。
  • 关键是您通常使用其中之一,您不会将它们组合在一起。 async/await 是使用具有同步外观代码的承诺的语法,通常不需要.then.catch(在async 函数中,.then => await,@987654343 @ => try/catch)。建议一些reading up。 :-)
  • 最后:这段代码中的writer 是什么?你确定你可以这样重复使用它吗? (鉴于错误,我认为您可能不能。)
  • 我认为最好让你自己去做。编码愉快。

标签: javascript node.js csv


【解决方案1】:

最后,我找到了解决方案。我需要在每次将数据写入文件之前初始化writer 变量,因为它以writer.end() 结尾。我正在分享代码:

  // Get sensor measurement data for each devices
  for(let j=0;j<data.length;j++){
  // Intialize the writer everytime before creating a file
    var writer = csvWriter({ headers: ["TimeStamp", "Gas","gw_temp","rh","abrasion","sensor_temp"]});
    await writer.pipe(fs.createWriteStream(data[j][0] + '.csv'));
    await axios.get([API CALL URL].join('/'), getConfig)
    .then(async (response) => {
      let res = await response.data;
      //console.log(res.length);
      if(res.length!=0){
       for (let i = 0; i < res.length; i++) {
         await writer.write(res[i]);
       }
      }
      await console.log("File writing done",data[j][0]);
      await writer.end();

    })
    .catch((error) => {
      if (error.response) {
        console.log("Error in response", error.message);
      } else {
        console.log("Other error", error.message);
      }
    });
  }

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2014-07-29
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多