не может деодефицировать методы в модуле node-ftp

Я новичок как в node.js, так и в вызове функции стиля обещания. Взглянув на пример деоделирования на http://runnable.com/Ulatc0QnzUgUAAAK/adapting-node-js-with-q-for-promises, я пытаюсь деодеифицировать методы модуля node-ftp node.js следующим образом:

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: Object # has no method '_pasv'»

Я не уверен, что не так с этим фрагментом кода. Кто-нибудь знает, что с этим не так? Можете ли вы указать мне какой-нибудь способ отладки/устранения причины этого сообщения об ошибке?

Спасибо.


person user526929    schedule 15.03.2014    source источник
comment
Вам также не хватает закрывающей скобки в конце вашего первого .then().   -  person jfriend00    schedule 15.03.2014


Ответы (2)


Когда вы проходите

ftpClient.list

к Q.denodefiy вы получаете объект функции, list из объекта ftpClient. Это будет просто функция, и связь с родителем будет потеряна. Это важно, потому что связанная функция list может зависеть от объекта ftpClient. Итак, вы должны убедиться, что ссылка не сломана.

Цитата из Q.denodeify документов,

Обратите внимание: если у вас есть метод, использующий шаблон обратного вызова Node.js, а не просто функция, вам нужно будет привязать его значение this перед передачей его в деоделирование. , вот так:

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

Лучшей стратегией для методов было бы использование Q.nbind, как показано ниже.

Итак, вы можете исправить свой код двумя способами:

  1. Используя Q.denodeify и Function.prototype.bind, вот так

    var ftpList = q.denodeify(ftpClient.list.bind(ftpClient));
    
  2. Используя Q.nbind, вот так

    var ftpList = q.nbind(ftpClient.list, ftpClient);
    
person thefourtheye    schedule 15.03.2014

вам нужно использовать q.nbind

q.nbind(ftpClient.list, ftpClient);
person wayne    schedule 15.03.2014