无法在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
,如下所示。
所以,你可以用两种方法修复你的代码,
-
使用
Q.denodeify
和Function.prototype.bind
,就像这样var ftpList = q.denodeify(ftpClient.list.bind(ftpClient));
-
像这样使用
Q.nbind
var ftpList = q.nbind(ftpClient.list, ftpClient);
你需要使用q.nbind
q.nbind(ftpClient.list, ftpClient);