Вы не указываете, где именно возникает эта ошибка «Невозможно прочитать свойство readdir неопределенной ошибки». Если это происходит в этой строке кода:
let readdirAsync = util.promisify(sftp.readdir);
Тогда проблема в том, что sftp
равно undefined
. Но, похоже, проблема не в этом, потому что вы говорите, что const sftp2 = Promise.promisifyAll(sftp)
работает.
Итак, я предполагаю, что проблема возникает, когда вы пытаетесь использовать readdirAsync
. Если это так, то это, вероятно, потому, что вы потеряли родителя sftp, когда сделали let readdirAsync = util.promisify(sftp.readdir)
, и это как-то важно для реализации метода readdir. Если это действительно так, то вы можете сделать это:
let readdirAsync = util.promisify(sftp.readdir).bind(sftp);
Чтобы убедиться, что родительский объект остается связанным с методом. Поскольку Bluebird .promisifyAll()
помещает новые методы в исходный объект, и вы вызываете их как методы объекта, а не как простые функции, эта привязка к исходному объекту происходит автоматически, когда вы вызываете их как sftp2.readdirAsync()
. Вы можете сделать это также как:
sftp.readdirAsync = util.promisify(sftp.readdir);
И тогда вы можете вызвать sftp.readdirAsync(...).then(...).catch(...)
, и они будут соответствующим образом привязаны к объекту sftp
.
P.S. Использование if (err) throw err
внутри асинхронного обратного вызова НИКОГДА не является хорошей обработкой ошибок. Вы буквально никогда не должны писать эту строку кода внутри асинхронного обратного вызова, если только вызывающая сторона этого асинхронного обратного вызова не имеет явного обработчика для этого исключения (что обычно не имеет место). Все, что он делает - это бросает исключение в асинхронное забвение, не имея возможности для фактической обработки ошибок где-либо еще в вашем коде.