我试图通过以下操作从csv文件中提取图像:
csv-parse
方法在大型csv文件中解析/流stream-transform
抓取每一行进行处理async
瀑布法进行处理。request
方法将映像下载并写入服务器由于某种原因,在数据被管道传输到createWriteStream,之后,会发生一些事件,在这种情况下,async
回调永远不会被调用。我只使用createWriteStream,运行了相同的代码,没有管道到request
,而且它可以工作。我还运行了createWriteStream w/ a drain
事件,那么它是如何工作的呢?有人能给我解释一下吗?
在下面的代码中,createWriteStream试图传输14,970个图像,但是request
close
或finish
事件只触发14,895次,error
触发0次。这会是一个令人筋疲力尽的问题吗?是否会超出highWaterMark
,并且可能会发生未被检测到的写失败?
下面是我的csv代码行:
var first = true;
var parser = parse();
var transformer = transform( (line, complete) => {
if(!first)
extractData(line,complete)
else {
first = false;
complete(null);
}
},
() => {
console.log('Done: parseFile');
});
fs.createReadStream(this.upload.location).pipe(parser).pipe(transformer);
不总是执行必需的extractData
回调的async
函数:
extractData(line,complete){
var now = new Date();
var image = {
createdAt: now,
updatedAt: now
};
async.waterfall([
next => { // Data Extraction
async.forEachOf(line, (data, i, complete) => {
if(i === 2) image.src = data;
if(i === 3) image.importSrc = data;
complete(null);
}, err => {
if(err) throw err;
next(null);
});
},
next => { // Download Image
var file = fs.createWriteStream('public/'+image.src);
var sendReq = request.get(image.importSrc);
sendReq.on('response', response => {
if (response.statusCode !== 200) {
this.upload.report.image.errors++;
return next(null);
}
});
sendReq.on('error', err => {
this.upload.report.image.errors++;
next(null);
});
sendReq.pipe(file);
file.on('finish', () => {
this.upload.report.image.inserts++;
file.close(next); // Close file and callback
});
file.on('error', err => {
this.upload.report.image.errors++;
next(null);
});
}
], err => {
if(err) throw err;
complete(null);
});
}
正如@mscdex所建议的那样,我还尝试将finish
替换为close
方法。
发布于 2016-04-14 19:26:42
file.close(next);
是不必要的,因为默认情况下文件流会自动关闭。您可以做的是侦听close
事件,以了解流的文件描述符何时关闭。因此,将整个finish
事件处理程序替换为:
file.on('close', () => {
this.upload.report.image.inserts++;
next(null);
});
https://stackoverflow.com/questions/36631611
复制相似问题