我正尝试通过执行以下操作从csv文件中提取图像:
</body>
和csv-parse
createReadStream 方法在大型csv文件中解析/流式传输fs
stream-transform
瀑布方法提取图像和其他行数据以进行处理。async
和request
createWriteStream 方法将图像下载并写入服务器由于某些原因,在数据通过管道传输到 createWriteStream 之后,有一些事件导致fs
回调永远不会被调用。我只使用async
运行相同的代码,而没有管道到 createWriteStream ,它可以工作。我还运行 createWriteStream w / request
事件,然后是一些如何运作?任何人都可以向我解释这个吗?
在下面的代码中,drain
正在尝试管理14,970张图片,但 createWriteStream request
或close
事件仅发送14,895次,{{1} 1}}发射0次。这可能是一个耗尽的问题吗?可能会超出finish
并且未检测到写入失败吗?
这是我的csv行获取代码:
error
highWaterMark
函数并不总是执行必需的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
正如@mscdex所建议的那样,我还尝试将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);
});
}
方法。
答案 0 :(得分:0)
file.close(next);
是不必要的,因为默认情况下文件流会自动关闭。您可以做的是监听close
事件,以了解流的文件描述符何时关闭。因此,将整个finish
事件处理程序替换为:
file.on('close', () => {
this.upload.report.image.inserts++;
next(null);
});