不能denodeify在节点-FTP模块的方法(cannot denodeify methods i

2019-10-19 13:57发布

我是新来的都node.js的,并承诺风格的函数调用。 通过观察在denodeify例如http://runnable.com/Ulatc0QnzUgUAAAK/adapting-node-js-with-q-for-promises ,我试图denodeify Node.js的节点-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();

但是,运行与节点的代码时,它显示错误“列表错误:类型错误:对象#有没有方法‘_pasv’”

我不知道什么是错的一段代码。 有谁知道这有什么错呢? 你能给我一些方法来调试/解决该错误消息的原因是什么?

谢谢。

Answer 1:

当你通过

ftpClient.list

Q.denodefiy ,你所得到的函数对象, listftpClient对象。 这将只是一个功能,并与母公司的关系都将丢失。 因为,绑定的功能,这一点很重要list可能是依赖于上ftpClient对象。 所以,你必须确保链路中断。

从报价Q.denodeify文档 ,

请注意,如果您有使用Node.js的回调格局的方法 ,而不是只是一个功能,您将需要将其传递给denodeify,像这样之前绑定this值:

 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); 


Answer 2:

你需要使用q.nbind

q.nbind(ftpClient.list, ftpClient);


文章来源: cannot denodeify methods in node-ftp module