2016-05-19 11 views
0

Ich habe Probleme, Fehler von einer Funktion zu berichten, wo ich eine Datei lesen und es über CSV-Parse leiten. Was ich tun möchte, ist, wenn es eine Zeile gibt, die nicht drei Felder hat, möchte ich einen Fehler zurückmelden - zu einem async.series-Aufruf. Diese erste Implementierung nicht alsFehler bei der Verwendung von Async mit Streams melden node.js

function insertCsvIntoObject(done) { 
    fs.createReadStream(inputCsvFilepath) 
    .pipe(csvParser) 
    .on('data', function (csvRow) { 
     console.log('csv row:', csvRow); 
     if (csvRow.length !== 3) { 
      this.emit('error', "Does this go anywhere?"); 
     } 
    }) 
    .on('end', function() { 
     done(null, "Finished reading through the csv data"); 
    }) 
    .on('error', function (err) { 
     console.log('errors is now:', csvReadErrors); 
     done(new Error('Error reading csv file'), "CSV Parse error"); 
    }); 
} 

Daraus ergibt sich eine Ausnahme: Wenn wir mehrere problematische Zeilen in der CSV-Datei haben: [Fehler Rückruf wurde bereits genannt.].

eine Rückkehr vor dem getan

return done(new Error('Error reading csv file'), "CSV Parse error"); 

ist auch keine Hilfe hinzufügen, da wir nicht von der übergeordneten Funktion beenden und zurückkehren kann - insertCsvIntoObject.

Darüber hinaus wird das Ereignis .on ('end', ..) nie ausgelöst, wenn es Fehlerereignisse gibt.

Wie kann man Fehler in einer solchen Situation korrekt melden?

Antwort

1

Es sieht wie csv-parse bereits einen Fehler aus, wenn die Anzahl der Spalten in einer Zeile nicht konsistent ist. Mit anderen Worten, Sie sollten nicht selbst einen ausgeben müssen.

Um einen Rückruf aus werden mehrmals aufgerufen zu verhindern, können Sie ein verpacktes verwenden wie once:

function insertCsvIntoObject(done) { 
    done = once(done); 
    ... 
}; 

Im Idealfall sollten Sie in der Lage sein, die Verarbeitung nach dem ersten Fehler zu beenden, aber ich habe nicht gewesen in der Lage, den Parser zu stoppen, zusätzliche Datensätze zu analysieren (this.end() scheint nicht zu funktionieren, aber vielleicht fehlt mir etwas).

+0

Fair. Ich endete mit Relax_column_count – saraf

+0

Fair. Ich habe festgestellt, dass das Ausgeben eines Fehlers nicht der beste Weg ist, Fehler auf Async zurückzugeben - da der Prozess abbricht, ohne dass die gesamte Datei gelesen wird. Am Ende benutze ich relax_column_count, um csv-parse bis zum Ende durchzulesen (da ich vielleicht mehr Checks habe, um sicherzustellen, dass die Felder in einer Zeile gültig sind - und ich vielleicht Datensätze mit Bedacht löschen möchte, statt den gesamten Prozess anzuhalten) sammelte alle Fehler und schickte sie zurück über den Callback zu async in .on ('end', ...) Danke für den Tipp über einmal (fertig) :-) – saraf

Verwandte Themen