TypeError: instance[method].bind is not a function AdonisJs

TypeError: instance[method].bind is not a function AdonisJs

我正在将 MQTT-adonis 模块 adonis-mqtt respo on git here 集成到 adonis-js 应用程序中,但在服务时抛出异常

TypeError: instance[method].bind is not a function

任何人都可以指导为什么会出现这种情况。

//event.js

'use strict'
 const Event = use('Event');
const Mqtt = use('Mqtt');
// Listen to some Events of the library
Event.on('MQTT:Connected', 'Message.subscription')
Event.on('MQTT:Disconnected', 'Message.disconnected')

//Listeners/Message.js

class Message extends MqttListener {

get subscription () {
return 'Topic/Info'
 }

async handleMessage (message, wildcardMatches) {
  }

它似乎在这个块中抛出异常

//node_modules/adonis-mqtt/Mqtt/Mqtt.js

this.client.on('connect', this._handleConnect.bind(this)) //here at this line
    this.client.on('offline', this._handleDisconnect.bind(this))
    this.client.on('close', this._handleDisconnect.bind(this))
    this.client.on('end', this._handleDisconnect.bind(this))
    this.client.on('message', this._handleMessage.bind(this))

EDIT:::

如何重现:

先决条件:

克隆这个:

更新:

从订阅功能中删除 get 时,它可以正常工作,但我无法在以下代码片段中获取所需的数据

//node_modules/adonis-mqtt/Mqtt/Mqtt.js

async _registerListener (file) {
    const filePath = path.join(this.listenersPath, file)
    let task
    try {
      task = require(filePath)
    } catch (e) {
      if (e instanceof ReferenceError) {
        debug(
          'Unable to import task class <%s>. Is it a valid javascript class?',
          file)
        return
      } else {
        throw e
      }
    }

    // Get instance of task class
    const taskInstance = ioc.make(task)
    if (!taskInstance.subscription || taskInstance.subscription === '') {
      console.error(`MqttListener ${file} does not have a subscription string!`)
    } else {
      this.client.subscribe(taskInstance.subscription) // here
      debug('Subscribed to topic %s', taskInstance.subscription)
      console.log('Subscribed to topic %s', taskInstance.subscription)
      this.listeners.push(taskInstance)
    }
  }

更新:2

应用程序中有两个文件夹,一个是 Listeners,另一个是 MqttListeners,它们都有相同的命名文件 Test.js ,它还强制保留这两个文件。但是,Listener 文件夹中存在的文件更改不会产生任何影响。但是,从 MqttListners 文件夹的文件中的 handleMessage() 中的订阅函数和控制台消息中删除 get 前缀似乎是完美的。接收已发布的主题信息

你的问题在这里

// events.js
Event.on('MQTT:Connected', 'Message.subscription')

由此,您将 Message.subscription 方法绑定到 MQTT:Connected 事件(实际上,这发生在 node_modules/@adonisjs/fold/src/Ioc/index.js#L879 中)。

但是,你的Message.subscription不是正常函数而是getter。您无法绑定 getter,因为此 method syntax 不使用函数表达式。

因此,为了解决您的问题,您应该将 MQTT:Connected 事件绑定到其他方法,即

// events.js
Event.on('MQTT:Connected', 'Message.connection')

// Listeners/Message.js
class Message extends MqttListener {
  connection() {
     return 'test/#';
  }
}

或者简单地从您的 subscription 方法中删除 get 前缀

// Listeners/Message.js
class Message extends MqttListener {

  subscription () {
    return 'test/#';
  }
}

如果我的回答不够清楚或者您需要一些额外的信息,请告诉我。

更新: 查看一些证明它有效的证据