2017-08-12 1 views
0

Ich habe ein Stück Code wie folgt aus:NodeJS Async Loop - nicht erreicht endgültige Fehlerblock

var async = require('async'); 
var ftp = require('jsftp'); 

async.waterfall([ 
    function(callback){ 
     console.log("Step 1"); 
     // fetch data from DB 
     callback(null); 
    }, 
    function(callback){ 
     console.log("Step 2"); 
     // FTP to remote location using a third party library 
     ftp.put(fileName, remoteLocation, function(err) { 
     if (!err){ 
      callback(null, "File transferred successfully!") 
     }else { 
      callback(err, null) 
     } 
    }); 
}], 
function(err, result){ 
    if(err){ 
     console.log("Step 2.5") 
     console.log(err); 
    }else{ 
     console.log("Step 3"); 
    } 
    callback(err, result); 
}); 

Nun, was ich erwarte, ist, wenn es in der FTP-Datei ein Fehler ist (lassen Sie uns das FTP sagen Server ist down) sollte die Schleife zu "Schritt 2.5" kommen.

Stattdessen gibt es nur einen Fehler (ECONNRESET, wenn der Server heruntergefahren ist), und es kommt nie zu dem letzten Block, wo es einen Rückruf sendet.

Gibt es eine Möglichkeit, die asynchrone Schleife zum logischen Abschluss zu zwingen?

Antwort

1

Der Fehler wird tief im net.js Modul von Node ausgegeben - musste die Implementierung von jsftp betrachten. Sie müssen ein event listener auf dem error event des FTP Objekts bereitstellen und es dort behandeln.

Hier ist eine modifizierte Version des Codes:

async.waterfall([ 
    function(callback) { 
     console.log("Step 1"); 
     // fetch data from DB 
     callback(null); 
    }, 
    function(callback) { 
     console.log("Step 2"); 
     // FTP to remote location using a third party library 

     ftp.on('error', function(error) { 
      callback(error); 
     }); 

     ftp.put(__dirname + '/data/myFile', '', function(err) { 
      if (!err){ 
       callback(null, "File transferred successfully!") 
      }else { 
       callback(err, null) 
      } 
     }); 
}], 
function(err, result){ 
    if(err){ 
     console.log("Step 2.5") 
     console.log(err); 
    }else{ 
     console.log("Step 3"); 
    } 
}); 
+0

so vielen Dank! – swateek

+0

Jederzeit! Froh, dass ich Helfen kann! – mscheker