1
votes

I am trying to create a custom Alexa skill in which I am calling an API. But somehow my code is behaving weird.

CASE - 1

'firstChance': function () {

    // Some code here//

    getJSON(options, function (err, result) {
        if (err) {
            return console.log('ERROR while trying to get country names', err);
        }

         console.log(result);
    });
    this.emit(':tell', speechOutput, speechOutput);
},

In this case no errors are shown in cloudwatch but the control is not going to getJSON function eventhough this.emit() function is executed.

Below are the cloudwatch logs:

    CloudWatch logs:

  
13:42:49
START RequestId: ************ Version: $LATEST


13:42:49
2018-04-03T13:42:49.578Z    *************** Warning: Application ID is not set


13:42:49
END RequestId: *********************


13:42:49
REPORT RequestId: **************    Duration: 74.03 ms  Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 48 MB


13:42:51
START RequestId: ***************** Version: $LATEST


13:42:51
2018-04-03T13:42:51.647Z    *********************** Warning: Application ID is not set


13:42:51
END RequestId: *************************


13:42:51
REPORT RequestId: ************************  Duration: 153.09 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 49 MB

CASE 2 :

'firstChance': function () {

    // Some code here//


    getJSON(options, function (err, result) {
        if (err) {
            return console.log('ERROR while trying to get country names', err);
        }

         console.log(result);
    });
    //this.emit(':tell', speechOutput, speechOutput);
},

In this case even though there are no errors in the logs and the control is going to getJSON, but alexa says "There was a problem with the requested skill's response".

    Below are the cloudwatch logs:


13:35:32
START RequestId: ************************** Version: $LATEST


13:35:32
2018-04-03T13:35:32.896Z    e16ddc70-3743-11e8-bf3b-a98fb0c89baf    Warning: Application ID is not set


13:35:32
END RequestId: **************************


13:35:32
REPORT RequestId: **************************    Duration: 110.81 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 48 MB


13:35:35
START RequestId: ************************** Version: $LATEST


13:35:35
2018-04-03T13:35:35.549Z    **************************  Warning: Application ID is not set


13:35:35
2018-04-03T13:35:35.861Z    **************************  Response from Server started


13:35:35
2018-04-03T13:35:35.861Z    **************************  Server Status: 200


13:35:35
2018-04-03T13:35:35.861Z    **************************  Response Headers : {"server":"Cowboy","connection":"close","x-powered-by":"Express","content-type":"application/json; charset=utf-8","content-length":"187238","etag":"W/\"Vhlms2jCBxpTPF7sp9mxAw==\"","vary":"Accept-Encoding","date":"Tue, 03 Apr 2018 13:35:35 GMT","via":"1.1 vegur"}


13:35:35
2018-04-03T13:35:35.978Z    **************************  Preparing the hash map...


13:35:36
2018-04-03T13:35:35.978Z    **************************  [ { name: { common: 'Afghanistan', official: 'Islamic Republic of Afghanistan', native: [Object] }, tld: [ '.af' ], cca2: 'AF', ccn3: '004', cca3: 'AFG', currency: [ 'AFN' ], callingCode: [ '93' ], capital: 'Kabul', altSpellings: [ 'AF', 'Afġānistān' ], relevance: '0', region:


13:35:36
END RequestId: **************************


13:35:36
REPORT RequestId: **************************    Duration: 1249.65 ms    Billed Duration: 1300 ms Memory Size: 128 MB    Max Memory Used: 57 MB


13:35:36
START RequestId: ************************** Version: $LATEST


13:35:36
2018-04-03T13:35:36.954Z    e46c4ff4-3743-11e8-a19e-036de9469172    Warning: Application ID is not set


13:35:36
END RequestId: **************************


13:35:36
REPORT RequestId: **************************    Duration: 1.97 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 57 MB

I am not able to resolve this. I think, I have made some mistake in the callback of getJSON().

2

2 Answers

2
votes

It looks like getJSON is an asynchronous function: meaning it returns immediately and it calls you back when the results are ready, or when an error is thrown.

So, in your example, getJSON is invoked, but it returns immediately, followed by your call to this.emit(':tell') which ends your handler and sends the respobse back to Alexa before getJSON has a chance to complete and call your anonymous function callback.

To solve, move this.emit(...) inside the callback function you are passing into getJSON

 getJSON(options, function (err, result) {
    if (err) {
        // handle the error
        this.emit(':tell', 'Error getting country names');
        return console.log('ERROR while trying to get country names', err);
    }

     console.log(result);
     // handle the successful result
     this.emit(':tell', 'The country name was retrieved!');
});
0
votes

Either try this,

    'firstChance': function () {

    // Some code here//

    getJSON(options, function (err, result) {
        if (err) {
            return console.log('ERROR while trying to get country names', err);
        }

         console.log(result);
         this.emit(':tell', speechOutput, speechOutput);
    });

},

Or you can use set timeout :

        'firstChance': function () {

        // Some code here//

        getJSON(options, function (err, result) {
            if (err) {
                return console.log('ERROR while trying to get country names', err);
            }

             console.log(result);
        });

        setTimeout(() => {

             this.emit(':tell', speechOutput, speechOutput);
          }, 2500)       


    },

Or you can try Async - Await which are now natively available in AWS Lambda as mentioned here https://aws.amazon.com/blogs/compute/node-js-8-10-runtime-now-available-in-aws-lambda/