Ich versuche, Bilder aus einer CSV-Datei zu extrahieren, indem Sie die folgenden Schritte aus:createWriteStream ‚close‘ Ereignis nicht ausgelöst wird
- Parsing/Streaming in einer großen CSV-Datei
csv-parse
und diefs
createReadStream Methode - Ergreifung jeder Zeile zur Verarbeitung mit
stream-transform
- Extraktion von Bild- und anderen Zeilendaten zur Verarbeitung mit der Wasserfallmethode
async
. - Herunterladen und schreiben Bild Server
request
und diefs
createWriteStream Methode
Aus irgendeinem Grund, nachdem die Daten in createWriteStream geleitet wird, gibt es ein Ereignis, bei dem ein async
Rückruf aufgerufen wird nie. Ich habe den gleichen Code nur unter Verwendung request
, ohne Rohrleitungen zu createWriteStream ausgeführt, und es funktioniert. Ich habe auch ausgeführt createWriteStream w/a drain
Ereignis, und dann einige, wie es funktioniert? Kann mir das jemand erklären?
unten in dem Code versucht wird request
zu Rohr 14.970 Bilder, aber die createWriteStreamclose
oder finish
Ereignisse nur Feuer 14.895 mal, mit error
0 mal feuern. Könnte das ein dränierendes Problem sein? Könnte highWaterMark
überschritten werden und ein Schreibfehler könnte unbemerkt auftreten?
Hier mein csv Linie bekommt Code ist:
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
Funktion, die einen erforderlichen async
Rückruf nicht immer tun:
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);
});
}
Wie @mscdex vorgeschlagen habe ich auch versucht, Austauschen finish
für seinen Ersatz close
Ansatz.
ich es versuchen werde und lassen Sie wissen, ob es – user1828780
gearbeitet habe ich versucht, die oben und es hat nicht funktioniert. Es versucht, 14.970 Bilder herunterzuladen und anzufordern, aber "nahe" heißt nur 14.895 Mal. Auch "Fehler" wird 0 Mal aufgerufen. – user1828780