2016-04-14 84 views
0

我試圖通過執行以下操作來提取csv文件圖片:使用csv-parsefscreateReadStream方法createWriteStream「關閉」事件未觸發

  1. 解析/流在一個大的csv文件
  2. 抓取每行使用stream-transform
  3. 提取圖像和其他行數據以使用async瀑布方法進行處理。
  4. 下載和數據被管道輸送到createWriteStream後編寫使用requestfscreateWriteStream方法

出於某種原因,圖像服務器,有一些事件,其中async回調不會被調用。我已經運行相同的代碼只使用request,沒有管道到createWriteStream,它的工作原理。我也運行createWriteStream w/a drain事件,然後一些它是如何工作的?任何人都可以向我解釋這個嗎?

在下面的代碼,request試圖管14970張的圖像,但是createWriteStreamclosefinish事件只火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的做法。

回答

0

file.close(next);是不必要的,因爲文件流默認是自動關閉的。你可以做的是聽取close事件,以瞭解流的文件描述符何時已關閉。所以更換整個finish事件處理程序:

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

我給它一個去,讓你知道它的工作 – user1828780

+0

我嘗試了上面,並沒有奏效。它試圖下載和請求14,970張圖像,但「close」僅被稱爲14,895次。 '錯誤'被稱爲0次。 – user1828780