2016-12-09 4 views
0

Ich möchte Dateien mit EasyFTP verschieben, aber wenn ich die Verbindung schließe, schließt es vor dem Verschieben einer Datei, und wenn ich die Verbindung nicht schließe, erhalte ich einen Fehler.Wie kann dieser Code in Node.Js synchron ausgeführt werden?

Fehler: 503 RNFR erforderlich erste

Also hier ist mein Code

var EasyFtp = require('easy-ftp'); 
var ftp = new EasyFTP(); 
var config = { 
    host: '', 
    port: 21, 
    username: '', 
    password: '' 
}; 

ftp.connect(config); 

var filesFrom=['/file1.txt','/anotherFile.txt','/moreFiles.txt','/a.txt','/x.txt'] 
var filesTo=['/archived/file1.txt','/archived/anotherFile.txt','/archived/moreFiles.txt','/archived/a.txt','/archived/x.txt'] 

for (var i = 0; i < filesFrom.length; i++) { 
    ftp.mv(filesFrom[i], filesTo[i], function(err, newPath){ 
     if (err) { console.log(err) } 
    }); 
}; 

ftp.close(); 
+0

Sie die Verbindung schließen, bevor Sie tatsächlich senden Sie die Anfrage, verwenden Sie Versprechungen und Promise.all, um nur zu schließen, wenn alle Anfrage beendet ist. – Alon

Antwort

1

Sie nicht asynchrone Dinge laufen in Javascript synchron machen. Und da eine for-Schleife synchron ist, können Sie eine for-Schleife nicht darauf warten, dass ein asynchroner Vorgang abgeschlossen wird, bevor die nächste Iteration ausgeführt wird. Stattdessen müssen Sie eine andere Technik für Ihre Iteration verwenden. Es gibt viele verschiedene Möglichkeiten. Hier ist eine Option, die manuell durchläuft, die Auslösung der nächsten Iteration, wenn der vorherige getan wird:

function mvFiles(ftpObj, fromArray, toArray, callback) { 
    let index = 0; 
    let results = []; 

    function next() { 
     if (index < fromArray.length) { 
      let i = index++; 
      ftpObj.mv(fromArray[i], toArray[i], function(err, newPath) { 
       if (err) { 
        callback(err); 
       } else { 
        results[i] = newPath; 
        // run next iteration now 
        next(); 
       } 
      }); 
     } else { 
      // all done 
      callback(null, results); 
     } 
    } 

    // start first iteration 
    next(); 
} 

Verbrauch:

ftp.connect(config); 

var filesFrom =['/file1.txt','/anotherFile.txt','/moreFiles.txt','/a.txt','/x.txt']; 
var filesTo =['/archived/file1.txt','/archived/anotherFile.txt','/archived/moreFiles.txt','/archived/a.txt','/archived/x.txt']; 

mvFiles(ftp, filesFrom, filesTo, function(err, newPaths) { 
    ftp.close(); 
    if (err) { 
     // process error here 
    } else { 
     // all done here 
    } 
}); 
0

Es ist einfach, mit Drossel

var Bluebird = require('Bluebird'); 
var EasyFtp = require('easy-ftp'); 
var ftp = new EasyFTP(); 
var config = { 
    host: '', 
    port: 21, 
    username: '', 
    password: '' 
}; 

// Promisifying adds Async after every method which represents the promise version of that method... you don't have to follow the callback method. 
Bluebird.promisifyAll(ftp); 

ftp.connect(config); 

// push your promises into an array and then Promise.all() it... It will either complete fully or throw an error even if one fails.... All or nothing. 

var promises = []; 

var filesFrom=['/file1.txt','/anotherFile.txt','/moreFiles.txt','/a.txt','/x.txt'] 
var filesTo=['/archived/file1.txt','/archived/anotherFile.txt','/archived/moreFiles.txt','/archived/a.txt','/archived/x.txt'] 

for (var i = 0; i < filesFrom.length; i++) { 
    promises.push(ftp.mvAsync(filesFrom[i], filesTo[i])) 
}; 

// Now promises array contains all the promises and they have started executing. 

Bluebird.all(promises).then(function(results) { 

    // Results is an array of results from all the promises in order. 

    console.log(results); 

    // Close connection. 
    ftp.close(); 
}).catch(function(err) { 
    console.log(err); 
}); 
+0

Dieser Code führt alle FTP-Operationen gleichzeitig parallel aus. Wissen Sie, dass Sie das können? In Bluebird können Sie auch 'Promise.map()' oder 'Promise.mapSeries()' verwenden, anstatt das Versprechen-Array selbst zu sammeln. Speichert ein paar Zeilen Code und ermöglicht Ihnen die Steuerung des gemeinsamen Zugriffs. – jfriend00

Verwandte Themen