我試圖通過執行以下操作來提取csv文件圖片:使用csv-parse
和fs
createReadStream方法createWriteStream「關閉」事件未觸發
- 解析/流在一個大的csv文件
- 抓取每行使用
stream-transform
- 提取圖像和其他行數據以使用
async
瀑布方法進行處理。 - 下載和數據被管道輸送到createWriteStream後編寫使用
request
和fs
createWriteStream方法
出於某種原因,圖像服務器,有一些事件,其中async
回調不會被調用。我已經運行相同的代碼只使用request
,沒有管道到createWriteStream,它的工作原理。我也運行createWriteStream w/a drain
事件,然後一些它是如何工作的?任何人都可以向我解釋這個嗎?
在下面的代碼,request
試圖管14970張的圖像,但是createWriteStreamclose
或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
的做法。
我給它一個去,讓你知道它的工作 – user1828780
我嘗試了上面,並沒有奏效。它試圖下載和請求14,970張圖像,但「close」僅被稱爲14,895次。 '錯誤'被稱爲0次。 – user1828780