我可以使node.js FTP同步吗?

时间:2015-11-26 09:05:35

标签: javascript node.js node-ftp

我有一个小的FTP脚本,它基本上将整个目录树(通过fs.readdir行走)一次一个文件传输到FTP服务器(我必须对每个文件进行一些分析,因为它上传了一次一个的行为)。

但是,执行单个文件的位(对于使用c.mkdir而不是c.put的目录,还有另一位)如下所示:

console.log('Transferring [' + ival + ']');
var c = new Ftp();
c.on('ready', function() {
    c.put(ival, ival, function(err) {
        console.log(err);
    });
    c.end();
});

正如您所看到的,它使用一种非常简单的登录方法,即故障只是被发送到控制台。

不幸的是,由于FTP是异步完成的,因此错误将以与文件名输出完全无关的顺序传递到控制台。

有没有办法强制FTP同步完成,以便错误会立即跟随文件名?基本上,我希望在转到下一个文件之前完成从初始console.log到最终});的整个序列。

3 个答案:

答案 0 :(得分:4)

即使有,也不建议使用。您通常不希望使用如此长的同步操作来阻止事件循环。

使用递归或Promises确保事情按序列发生可能更有用。

示例:

let ivals = [/* lots of ivals here */];
function putItems(ivals) {
    let ival = ivals[0];
    console.log('Transferring [' + ival + ']');
    var c = new Ftp();
    c.on('ready', function() {
        c.put(ival, ival, function(err) {
            console.log(err);
            c.end();
            // Don't continue if we're out of items.
            if (ivals.length === 1) { return; } 
            putItems(ivals.slice(1)); // Call again with the rest of the items.
        });
    });
}

putItems(ivals);

通过使用嵌套函数和单个FTP上下文,可以更智能地完成它。但你明白了。

答案 1 :(得分:3)

如果不同步,您只需记录带错误的名称即可解决错误记录问题。你可以将它包装在一个闭包中,这样你就可以跟踪出现特定错误的ival

(function(ival) {
    console.log('Transferring [' + ival + ']');
    var c = new Ftp();
    c.on('ready', function() {
        c.put(ival, ival, function(err) {
            console.log('[' + ival + ']', err);
        });
        c.end();
    });
})(ival);

答案 2 :(得分:-1)

为什么不把错误推送到数组,当所有上传完成后,你将拥有该数组 所有这些错误按顺序排列?

我会做这样的事情:

var errArray = [];
console.log('Transferring [' + ival + ']');
var c = new Ftp();
c.on('ready', function() {
  c.put(ival, ival, function(err) {
    errArray.push( err );
  });
  c.end();
});
c.on('end', function() {
  errArray.forEach( function( err ){
    console.log( err );
  })
});