2016-04-14 16 views
0

Ich versuche, Bilder aus einer CSV-Datei zu extrahieren, indem Sie die folgenden Schritte aus:createWriteStream ‚close‘ Ereignis nicht ausgelöst wird

  1. Parsing/Streaming in einer großen CSV-Datei csv-parse und die fscreateReadStream Methode
  2. Ergreifung jeder Zeile zur Verarbeitung mit stream-transform
  3. Extraktion von Bild- und anderen Zeilendaten zur Verarbeitung mit der Wasserfallmethode async.
  4. Herunterladen und schreiben Bild Server request und die fscreateWriteStream 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.

Antwort

0

file.close(next); ist nicht erforderlich, da der Dateistream standardmäßig automatisch geschlossen wird. Stattdessen können Sie auf das Ereignis close warten, um zu wissen, wann der Dateideskriptor für den Stream geschlossen wurde. So ersetzen Sie die gesamten finish Ereignishandler:

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

ich es versuchen werde und lassen Sie wissen, ob es – user1828780

+0

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