edusperoni / nativescript-mqtt

MQTT 3.1.1 for Nativescript
Apache License 2.0
12 stars 3 forks source link

Cannot read property 'onConnectionFailure' of undefined #2

Closed kabaluyot closed 5 years ago

kabaluyot commented 5 years ago

I use nativescript-vue -ts template for an mqtt app and during compilation, these error shows image

crashing the entire app.

edusperoni commented 5 years ago

Please post the rest of the code. But from what I gather, it seems you're forgetting to create the client:

mqtt_client: MQTTClient = new MQTTClient(this.mqtt_clientOptions);
kabaluyot commented 5 years ago
//$router.push('/counter')
import {Vue,Component} from 'vue-property-decorator'
import {exit} from 'nativescript-exit';
import * as dialogs from "tns-core-modules/ui/dialogs";
import {MQTTClient, ClientOptions} from "nativescript-mqtt";
import {Message} from "nativescript-mqtt/common";

@Component
export default class Home extends Vue {

  //region data
  mqtt_host: string = "m15.cloudmqtt.com";
  mqtt_port: number = 30811;
  mqtt_useSSL: boolean = false;
  mqtt_path: string = "/mqtt";
  mqtt_username: string = "wtbqjojw";
  mqtt_password: string = "UE2yE1qKE_ed";
  mqtt_topic: string = "test-topic";

  mqtt_clientOptions: ClientOptions = {
        host: this.mqtt_host,
        port: this.mqtt_port,
        useSSL: this.mqtt_useSSL,
        path: this.mqtt_path
    };
  mqtt_client: MQTTClient = new MQTTClient(this.mqtt_clientOptions);

  //end region data

    constructor() {
      super();
      this.setupHandlers();
    }

  //region method
  connect() : void {
        try{
            this.mqtt_client.connect(this.mqtt_username, this.mqtt_password);
        }
        catch (e) {
            console.log("Caught error: " + e);
        }
    }

    subscribe() : void {
        try {
            this.mqtt_client.subscribe(this.mqtt_topic);
        }
        catch (e) {
            console.log("Caught error: " + e);
        }
    }

    setupHandlers() : void {
        this.mqtt_client.onConnectionFailure.on((err) => {
            console.log("Connection failed: " + err);
        });

        this.mqtt_client.onConnectionSuccess.on(() => {
            console.log("Connected successfully!");
            this.subscribe();
        });

        this.mqtt_client.onConnectionLost.on((err) => {
            console.log("Connection lost: " + err);
        });

        this.mqtt_client.onMessageArrived.on((message: Message) => {
            console.log("Message received: " + message.payload);
        });
    }

  quit():void{
   dialogs.confirm({
    title: "Confirm",
    message: "Do you really want to exit?",
    okButtonText: "YES",
    cancelButtonText: "NO",
    }).then(result => {
        // result argument is boolean
        if(result){
          exit();
        }
    });
  }
  //end region method
}
</script>
edusperoni commented 5 years ago

that's weird, can you confirm this.mqtt_client is defined in your constructor? It should be created by this line:

mqtt_client: MQTTClient = new MQTTClient(this.mqtt_clientOptions);

You can also try calling this.mqtt_client = new MQTTClient(this.mqtt_clientOptions); in your constructor

kabaluyot commented 5 years ago

ok I will try it.. by the way, I was following the angular-template but im using vue, does this work like in your ts demo code?, I mean like it updated automatically because of Observable class of tns-core

edusperoni commented 5 years ago

JS/TS/Angular/Vue shouldn't matter. The demo code is plain typescript. I just use:

    this.mqttClient = new MQTTClient({
      clientId: "test",
      host: "broker.mqttdashboard.com",
      path: "/mqtt",
      useSSL: false,
      port: 8000
    });

before registering the handlers.

You don't have to use Observable at all

kabaluyot commented 5 years ago

I tried declaring this.mqtt_client to constructor, still these shows

errors: S: found in JS: JS: ---> at components/Home.vue JS: JS: System.err: java.lang.RuntimeException: Unable to start activity ComponentInfo{in.championswimmer.nsvuets/com.tns.NativeScriptActivity}: com.tns.NativeScriptException: System.err: Calling js method onCreate failed System.err: System.err: TypeError: Cannot read property 'onConnectionFailure' of undefined System.err: File: "file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js, line: 6258, column: 6 System.err: System.err: StackTrace: System.err: Frame: function:'module.exports.../node_modules/ts-loader/index.js?!../node_modules/vue-loader/lib/index.js?!./components/Home.vue?vue&type=script&lang=ts&.Home.setupHandlers', file:'file:///data/data/in.championswimmer.nsvuets/files/app/bundle.js', line: 301, column: 26 System.err: Frame: function:'Home', file:'file:///data/data/in.championswimmer.nsvuets/files/app/bundle.js', line: 279, column: 15 System.err: Frame: function:'collectDataFromConstructor', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 50591, column: 16 System.err: Frame: function:'data', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 50665, column: 20 System.err: Frame: function:'getData', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 13868, column: 17 System.err: Frame: function:'initData', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 13825, column: 7 System.err: Frame: function:'initState', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 13764, column: 5 System.err: Frame: function:'Vue._init', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15038, column: 5 System.err: Frame: function:'Home', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15200, column: 12 System.err: Frame: function:'createComponentInstanceForVnode', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 14735, column: 10 System.err: Frame: function:'init', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 14560, column: 45 System.err: Frame: function:'createComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7530, column: 9 System.err: Frame: function:'createElm', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7477, column: 9 System.err: Frame: function:'createChildren', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7604, column: 9 System.err: Frame: function:'createElm', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7506, column: 9 System.err: Frame: function:'patch', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 8011, column: 7 System.err: Frame: function:'Vue._update', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7068, column: 19 System.err: Frame: function:'updateComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7179, column: 10 System.err: Frame: function:'get', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 6253, column: 25 System.err: Frame: function:'Watcher', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 6242, column: 12 System.err: Frame: function:'mountComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7186, column: 3 System.err: Frame: function:'push.../node_modules/nativescript-vue/dist/index.js.Vue.$mount', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15619, column: 10 System.err: Frame: function:'init', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 14566, column: 13 System.err: Frame: function:'createComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7530, column: 9 System.err: Frame: function:'createElm', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7477, column: 9 System.err: Frame: function:'patch', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 8011, column: 7 System.err: Frame: function:'Vue._update', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7068, column: 19 System.err: Frame: function:'updateComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7179, column: 10 System.err: Frame: function:'get', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 6253, column: 25 System.err: Frame: function:'Watcher', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 6242, column: 12 System.err: Frame: function:'mountComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7186, column: 3 System.err: Frame: function:'push.../node_modules/nativescript-vue/dist/index.js.Vue.$mount', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15619, column: 10 System.err: Frame: function:'', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15637, column: 10 System.err: Frame: function:'push.../node_modules/tns-core-modules/data/observable/observable.js.Observable.notify', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 20073, column: 23 System.err: Frame: function:'notifyLaunch', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 37914, column: 17 System.err: Frame: function:'push.../node_modules/tns-core-modules/ui/frame/frame.js.ActivityCallbacksImplementation.setActivityContent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 37847, column: 28 System.err: Frame: function:'push.../node_modules/tns-core-modules/ui/frame/frame.js.ActivityCallbacksImplementation.onCreate', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 37721, column: 14 System.err: Frame: function:'push.../node_modules/tns-core-modules/ui/frame/activity.js.NativeScriptActivity.onCreate', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 35686, column: 25 System.err: System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2825) System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2886) System.err: at android.app.ActivityThread.-wrap12(ActivityThread.java) System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1623) System.err: at android.os.Handler.dispatchMessage(Handler.java:102) System.err: at android.os.Looper.loop(Looper.java:186) System.err: at android.app.ActivityThread.main(ActivityThread.java:6509) System.err: at java.lang.reflect.Method.invoke(Native Method) System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:804) System.err: Caused by: com.tns.NativeScriptException: System.err: Calling js method onCreate failed System.err: System.err: TypeError: Cannot read property 'onConnectionFailure' of undefined System.err: File: "file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js, line: 6258, column: 6 System.err: System.err: StackTrace: System.err: Frame: function:'module.exports.../node_modules/ts-loader/index.js?!../node_modules/vue-loader/lib/index.js?!./components/Home.vue?vue&type=script&lang=ts&.Home.setupHandlers', file:'file:///data/data/in.championswimmer.nsvuets/files/app/bundle.js', line: 301, column: 26 System.err: Frame: function:'Home', file:'file:///data/data/in.championswimmer.nsvuets/files/app/bundle.js', line: 279, column: 15 System.err: Frame: function:'collectDataFromConstructor', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 50591, column: 16 System.err: Frame: function:'data', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 50665, column: 20 System.err: Frame: function:'getData', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 13868, column: 17 System.err: Frame: function:'initData', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 13825, column: 7 System.err: Frame: function:'initState', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 13764, column: 5 System.err: Frame: function:'Vue._init', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15038, column: 5 System.err: Frame: function:'Home', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15200, column: 12 System.err: Frame: function:'createComponentInstanceForVnode', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 14735, column: 10 System.err: Frame: function:'init', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 14560, column: 45 System.err: Frame: function:'createComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7530, column: 9 System.err: Frame: function:'createElm', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7477, column: 9 System.err: Frame: function:'createChildren', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7604, column: 9 System.err: Frame: function:'createElm', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7506, column: 9 System.err: Frame: function:'patch', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 8011, column: 7 System.err: Frame: function:'Vue._update', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7068, column: 19 System.err: Frame: function:'updateComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7179, column: 10 System.err: Frame: function:'get', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 6253, column: 25 System.err: Frame: function:'Watcher', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 6242, column: 12 System.err: Frame: function:'mountComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7186, column: 3 System.err: Frame: function:'push.../node_modules/nativescript-vue/dist/index.js.Vue.$mount', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15619, column: 10 System.err: Frame: function:'init', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 14566, column: 13 System.err: Frame: function:'createComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7530, column: 9 System.err: Frame: function:'createElm', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7477, column: 9 System.err: Frame: function:'patch', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 8011, column: 7 System.err: Frame: function:'Vue._update', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7068, column: 19 System.err: Frame: function:'updateComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7179, column: 10 System.err: Frame: function:'get', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 6253, column: 25 System.err: Frame: function:'Watcher', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 6242, column: 12 System.err: Frame: function:'mountComponent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 7186, column: 3 System.err: Frame: function:'push.../node_modules/nativescript-vue/dist/index.js.Vue.$mount', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15619, column: 10 System.err: Frame: function:'', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 15637, column: 10 System.err: Frame: function:'push.../node_modules/tns-core-modules/data/observable/observable.js.Observable.notify', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 20073, column: 23 System.err: Frame: function:'notifyLaunch', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 37914, column: 17 System.err: Frame: function:'push.../node_modules/tns-core-modules/ui/frame/frame.js.ActivityCallbacksImplementation.setActivityContent', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 37847, column: 28 System.err: Frame: function:'push.../node_modules/tns-core-modules/ui/frame/frame.js.ActivityCallbacksImplementation.onCreate', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 37721, column: 14 System.err: Frame: function:'push.../node_modules/tns-core-modules/ui/frame/activity.js.NativeScriptActivity.onCreate', file:'file:///data/data/in.championswimmer.nsvuets/files/app/vendor.js', line: 35686, column: 25 System.err: System.err: at com.tns.Runtime.callJSMethodNative(Native Method) System.err: at com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1116) System.err: at com.tns.Runtime.callJSMethodImpl(Runtime.java:996) System.err: at com.tns.Runtime.callJSMethod(Runtime.java:983) System.err: at com.tns.Runtime.callJSMethod(Runtime.java:967) System.err: at com.tns.Runtime.callJSMethod(Runtime.java:959) System.err: at com.tns.NativeScriptActivity.onCreate(NativeScriptActivity.java:18) System.err: at android.app.Activity.performCreate(Activity.java:6992) System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778) System.err: ... 9 more

code:

`import {Vue,Component} from 'vue-property-decorator' import {exit} from 'nativescript-exit'; import * as dialogs from "tns-core-modules/ui/dialogs"; import {MQTTClient, ClientOptions} from "nativescript-mqtt"; import {Message} from "nativescript-mqtt/common";

@Component export default class Home extends Vue {

//region data mqtt_host: string = "m15.cloudmqtt.com"; mqtt_port: number = 30811; mqtt_useSSL: boolean = false; mqtt_path: string = "/mqtt"; mqtt_username: string = "wtbqjojw"; mqtt_password: string = "UE2yE1qKE_ed"; mqtt_topic: string = "testtopic/1"; mqtt_client: MQTTClient;

mqtt_clientOptions: ClientOptions = { host: this.mqtt_host, port: this.mqtt_port, useSSL: this.mqtt_useSSL, path: this.mqtt_path };

//end region data

constructor() {
  super();
  this.mqtt_client = new MQTTClient(this.mqtt_clientOptions);
  this.setupHandlers();
}

//region method connect() : void { try{ this.mqtt_client.connect(this.mqtt_username, this.mqtt_password); } catch (e) { console.log("Caught error: " + e); } }

subscribe() : void {
    try {
        this.mqtt_client.subscribe(this.mqtt_topic);
    }
    catch (e) {
        console.log("Caught error: " + e);
    }
}

setupHandlers() : void {
    this.mqtt_client.onConnectionFailure.on((err) => {
        console.log("Connection failed: " + err);
    });

    this.mqtt_client.onConnectionSuccess.on(() => {
        console.log("Connected successfully!");
        this.subscribe();
    });

    this.mqtt_client.onConnectionLost.on((err) => {
        console.log("Connection lost: " + err);
    });

    this.mqtt_client.onMessageArrived.on((message?: Message) => {
      if(message){
        console.log("Message received: " + message.payload);
      }

    });
}

quit():void{ dialogs.confirm({ title: "Confirm", message: "Do you really want to exit?", okButtonText: "YES", cancelButtonText: "NO", }).then(result => { // result argument is boolean if(result){ exit(); } }); } //end region method }`

kabaluyot commented 5 years ago

Seems like all sub functions inside setuphandlers throws undefined, I tried it by commenting them one by one

kabaluyot commented 5 years ago

I figured it out.. It is because this inside the sub functions of setupHandlers was referring to the instance of the setupHandlers.. So I tried it by copying the functions and paste it directly to constructor and it was successfully connected.

kabaluyot commented 5 years ago

Here's the code for others: constructor() { super(); this.mqtt_client = new MQTTClient(this.mqtt_clientOptions); this.setupHandlers(this); }

and for setuphandlers: ` setupHandlers(vm: any) : void { vm.mqtt_client.onConnectionFailure.on((err:string) => { console.log("Connection failed: " + err); });

    vm.mqtt_client.onConnectionSuccess.on(() => {
        console.log("Connected successfully!");
        vm.subscribe();
    });

    vm.mqtt_client.onConnectionLost.on((err:string) => {
        console.log("Connection lost: " + err);
    });

    vm.mqtt_client.onMessageArrived.on((message?: Message) => {
      if(message){
        this.receiveMsg = message.payload;
        console.log("Message received: " + this.receiveMsg);
      }

    });
}`