无法在node-ftp模块中进行denodeify方法

我对node.js和promise样式函数调用都是新手。 通过在http://runnable.com/Ulatc0QnzUgUAAAK/adapting-node-js-with-q-for-promises看一个denodeify的例子,我试图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(); 

但是,当与节点运行该代码,它显示错误“列表错误:TypeError:对象#没有方法”_pasv'“

我不确定那段代码有什么问题。 有人知道这有什么问题吗? 你能指点我一些方法来debugging/疑难解答错误信息的原因?

谢谢。

当你通过

 ftpClient.list 

Q.denodefiy ,你正在从Q.denodefiy对象获取函数对象, list 。 这只是一个function,与父母的关系已经失去了。 这很重要,因为绑定的函数list可能依赖于ftpClient对象。 所以,你必须确保链接不被破坏。

Q.denodeify文档引用,

请注意,如果您有一个使用Node.jscallback模式的方法 ,而不仅仅是一个函数,您需要在将其传递给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); 

你需要使用q.nbind

 q.nbind(ftpClient.list, ftpClient);