gpt4 book ai didi

javascript - 无法在 node-ftp 模块中取消 Node 化方法

转载 作者:行者123 更新时间:2023-11-30 07:24:22 25 4
gpt4 key购买 nike

我是 node.js 和 promise 风格函数调用的新手。通过查看 http://runnable.com/Ulatc0QnzUgUAAAK/adapting-node-js-with-q-for-promises 上的 denodeify 示例,我正在尝试对 node.js node-ftp 模块的方法进行去 Node 化,如下所示:

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

但是,当使用 Node 运行该代码时,它显示错误“list error: TypeError: Object # has no method '_pasv'”

我不确定那段代码有什么问题。有谁知道这是怎么回事?你能告诉我一些方法来调试/解决该错误消息的原因吗?

谢谢。

最佳答案

当你通过时

ftpClient.list

Q.denodefiy,您正在从ftpClient 对象获取函数对象list。这将只是一个功能,与父级的关系将丢失。这很重要,因为绑定(bind)函数 list 可能依赖于 ftpClient 对象。因此,您必须确保该链接没有损坏。

引自Q.denodeify docs ,

Note that if you have a method that uses the Node.js callback pattern, as opposed to just a function, you will need to bind its this value before passing it to denodeify, like so:

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

The better strategy for methods would be to use Q.nbind, as shown below.

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

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

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

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

关于javascript - 无法在 node-ftp 模块中取消 Node 化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22419382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com