【发布时间】: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: Error: 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