无法对node-ftp模块中的方法进行去除

时间:2014-03-15 04:05:43

标签: javascript node.js promise

我是node.js和promise样式函数调用的新手。通过查看http://runnable.com/Ulatc0QnzUgUAAAK/adapting-node-js-with-q-for-promises处的denodeify示例,我试图将node.js node-ftp模块的方法去除如下:

var ftp = require('ftp');
var q = require('q');
var ftpClient = new ftp();
ftpClient.on('ready', function() {
    var ftpList = q.denodeify(ftpClient.list);
    ftpList().then(function(list) {
        console.log(list);
    }.then(null, function(err) {
        console.log(err);
    }).done(function() {
        ftpClient.end();
    });
});
ftpClient.connect();

但是,当使用节点运行该代码时,它会显示错误" list error:TypeError:Object#没有方法' _pasv'"

我不确定这段代码有什么问题。有谁知道这有什么问题?你能指点我一些方法来调试/排除错误信息的原因吗?

感谢。

2 个答案:

答案 0 :(得分:7)

传递

ftpClient.list

Q.denodefiy,您将从list对象获取函数对象ftpClient。它只是一个功能,与父母的关系就会丢失。这很重要,因为绑定函数list可能依赖于ftpClient对象。因此,您必须确保链接没有被破坏。

引自Q.denodeify docs

  

请注意,如果您使用Node.js回调模式的 方法 ,   与仅仅是一个函数相比,您需要绑定它的这个值   在将它传递给denodeify之前,就像这样:

var Kitty = mongoose.model("Kitty");
var findKitties = Q.denodeify(Kitty.find.bind(Kitty));
     

更好的方法策略是使用Q.nbind,如下所示。

因此,您可以通过两种方式修复代码,

  1. 使用Q.denodeifyFunction.prototype.bind,就像这样

    var ftpList = q.denodeify(ftpClient.list.bind(ftpClient));
    
  2. 使用Q.nbind,就像这样

    var ftpList = q.nbind(ftpClient.list, ftpClient);
    

答案 1 :(得分:1)

您需要使用q.nbind

q.nbind(ftpClient.list, ftpClient);