【问题标题】:Cannot read property of undefined after Promise.promisify在 Promise.promisify 之后无法读取 undefined 的属性
【发布时间】:2016-07-27 05:30:16
【问题描述】:
let nasPath = "";
return getFamInfo(args.familyID)
    .then(function (famInfo) {
        nasPath = //some code involving famInfo here
        return getSFTPConnection(config.nasSettings);
    }).then(function (sftp) {
      const fastPutProm = Promise.promisify(sftp.fastPut);
      return fastPutProm(config.jpgDirectory, nasPath, {});
    });

如果我在const fastPutProm = Promise.promisify(sftp.fastPut); 之后放置一个断点,fastPutProm 就是一个带有三个参数的函数。但是当我尝试运行这段代码时,我得到了一个TypeError: Cannot read property 'fastPut' of undefined 错误。我在这里做错了什么?

【问题讨论】:

    标签: javascript node.js promise bluebird


    【解决方案1】:

    该错误意味着您的sftp 值为undefined,因此当您尝试将sftp.fastPut 传递给promisify() 方法时,它会生成错误,因为您尝试引用undefined.fastPut 这是一个@ 987654327@.

    因此,解决方案是备份几个步骤并找出sftp 中没有所需值的原因。


    另一种可能性是错误来自模块内部,这是因为sftp.fastPut 的实现引用了this,它预计是sftp。您的承诺方法不是保留this 的值。您可以通过将代码更改为:

    const fastPutProm = Promise.promisify(sftp.fastPut, {context: sftp});
    

    【讨论】:

    • 但事实并非如此。如果我设置断点并检查它,sftpSFTPWrapper 类型的变量
    • @AyushISM - 不要断点,而是在你的 promisify 行之前执行 console.log(sftp) 并在那里查看结果。另外,请准确告诉我们报告错误的代码行。也许它在您的代码中的其他地方。
    • console.log() 显示与断点相同的信息。正在报告return fastPutProm(config.jpgDirectory, nasPath, {}); 行的错误。
    • @AyushISM - 你能告诉我们sftp.fastPut()的代码吗?它是否在实现中使用this 的值?如果是这样,您必须将sftp 上下文传递给promisify() 方法。请参阅Bluebird's .promisify() 上的context 选项。也许试试这个:const fastPutProm = Promise.promisify(sftp.fastPut, {context: sftp});
    • @AyushISM - 将其添加到我的答案中。他们的关键信息是查看堆栈跟踪中错误的来源。它显然源自另一个模块,而不是您的代码。
    猜你喜欢
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2016-10-24
    • 1970-01-01
    • 2018-12-12
    • 2022-08-16
    相关资源
    最近更新 更多