0

I have problem with my Lambda, actually in promise nodejs. I have wrote code like this in my Lambda:

'use strict'
const Alexa = require('alexa-sdk');
const mqtt = require('mqtt');

const APP_ID = undefined;

const WELCOME_MESSAGE = 'Welcome to the lamp control mode';
const WELCOME_REPROMT = 'If you new please say help'
const HELP_MESSAGE = 'In this skill you can controlling lamp to turn off or on, dim the lamp, change the lamp color and schedule the lamp';
const STOP_MESSAGE = 'Thanks for using this skill, Goodbye!';
const OFF_RESPONSE = 'Turning off the lamp';
const ON_RESPONSE = 'Turning on the lamp';
const DIM_RESPONSE = 'Dimming the lamp';
const CHANGE_RESPONSE = 'Changing the lamp color';
const AFTER_RESPONSE = 'Wanna control something again ?';

const handlers = {
    'LaunchRequest': function () {
        this.emit(':ask', WELCOME_MESSAGE, WELCOME_REPROMT);
    },
    'OnOffIntent' : function () {
        var status = this.event.request.intent.slots.status.value;
        var location = this.event.request.intent.slots.location.value;

        console.log(status);
        console.log(location);

        if (status == 'on') {
            // Promise Start
            var mqttPromise = new Promise(function(resolve, reject) {
                var options = {
                  port: '1883',
                  clientId: 'mqttjs_' + Math.random().toString(16).substr(2, 8),
                  username: 'username',
                  password: 'password',
                };
                var client  = mqtt.connect('mqtt://broker-address', options)
                client.on('connect', function() {
                    client.publish("lamp/status", status + ' ' + location, function() {
                        console.log("Message is published");
                        client.end();
                        resolve('Done Sending');
                    });
                });
            });
            mqttPromise.then(
                function(data) {
                    console.log('Function called succesfully', data);
                    this.emit(':ask', ON_RESPONSE, AFTER_RESPONSE);
                }, function(err) {
                    console.log('An error occurred: ', err);
                }
            );
            // Promise END
            // this.emit(':ask', ON_RESPONSE, AFTER_RESPONSE);
                       // client.publish("lamp/status", status + ' ' + location);
        } else if (status == 'off') {
            this.emit(':ask', OFF_RESPONSE, AFTER_RESPONSE);
            // client.publish("lamp/status", status + ' ' + location);
        }
    },
    'DimIntent' : function () {
        // to do here
    },
    'ChangeColorIntent' : function () {
        // to do here
    },
    'ShceduleIntent' : function () {
        // to do here
    },
    'AMAZON.HelpIntent': function () {
        this.emit(':ask', HELP_MESSAGE, 'Wanna control something ?');
    },
    'AMAZON.StopIntent': function () {
        this.emit(':tell', STOP_MESSAGE);
    }
};

exports.handler = function (event, context, callback) {
    const alexa = Alexa.handler(event, context, callback);
    alexa.APP_ID = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
}

I test my code with Service Simulator in Alexa Developer and get this result : Result Image

So I checked output in Lambda and I got this error report : Error in Lamda

Can anyone please help me? I have no idea with this because this is my first trial :)

Cicil Thomas
  • 4,139
  • 2
  • 22
  • 38

1 Answers1

0

The crux of your error seems to be this specific line in the log:

Cannot read property 'emit' of undefined

And after following the flow of your program, it's likely ocurring here:

mqttPromise.then(
  function(data) {
    console.log('Function called succesfully', data);
      // It's probably ocurring in this line below
      this.emit(':ask', ON_RESPONSE, AFTER_RESPONSE);
  }, function(err) {
    console.log('An error occurred: ', err);
  }
)

The log is saying that you tried using this, it's undefined and doesn't have an emit property. Thats ocurring because of how this works in Js. You could workaround this problem by saving a reference to this

var that = this;
var mqttPromise = new Promise(function(resolve, reject) {
        var options = {
          port: '1883',
          clientId: 'mqttjs_' + Math.random().toString(16).substr(2, 8),
          username: 'username',
          password: 'password',
        };
        var client  = mqtt.connect('mqtt://broker-address', options)
        client.on('connect', function() {
            client.publish("lamp/status", status + ' ' + location, function() {
                console.log("Message is published");
                client.end();
                resolve('Done Sending');
            });
        });
    });
    mqttPromise.then(
        function(data) {
            console.log('Function called succesfully', data);
            that.emit(':ask', ON_RESPONSE, AFTER_RESPONSE);
        }, function(err) {
            console.log('An error occurred: ', err);
        }
    );

I would also recommend reading up a bit on "How 'this' works in Javascript"

Dudemullet
  • 400
  • 1
  • 6