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:::
如何重现:
先决条件:
克隆这个:
移动到目录路径
npm install
adonis serve --dev
更新:
从订阅功能中删除 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/#';
}
}
如果我的回答不够清楚或者您需要一些额外的信息,请告诉我。
更新:
查看一些证明它有效的证据
我正在将 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:::
如何重现:
先决条件:
克隆这个:
移动到目录路径
npm install
adonis serve --dev
更新:
从订阅功能中删除 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/#';
}
}
如果我的回答不够清楚或者您需要一些额外的信息,请告诉我。
更新:
查看一些证明它有效的证据