createWriteStream' close'事件未被触发

时间:2016-04-14 18:52:58

标签: node.js csv asynchronous request fs

我正尝试通过执行以下操作从csv文件中提取图像:

  1. 使用</body>csv-parse createReadStream 方法在大型csv文件中解析/流式传输
  2. 使用fs
  3. 抓取每一行进行处理
  4. 使用stream-transform瀑布方法提取图像和其他行数据以进行处理。
  5. 使用asyncrequest createWriteStream 方法将图像下载并写入服务器
  6. 由于某些原因,在数据通过管道传输到 createWriteStream 之后,有一些事件导致fs回调永远不会被调用。我只使用async运行相同的代码,而没有管道到 createWriteStream ,它可以工作。我还运行 createWriteStream w / request事件,然后是一些如何运作?任何人都可以向我解释这个吗?

    在下面的代码中,drain正在尝试管理14,970张图片,但 createWriteStream requestclose事件仅发送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); }); } 方法。

1 个答案:

答案 0 :(得分:0)

file.close(next);是不必要的,因为默认情况下文件流会自动关闭。您可以做的是监听close事件,以了解流的文件描述符何时关闭。因此,将整个finish事件处理程序替换为:

file.on('close', () => {
  this.upload.report.image.inserts++;
  next(null);
});