AWS Lambda not able to make REST call to external API

橙三吉。 提交于 2019-12-25 00:55:31

问题


I am using the nodeJS code to make a rest call using request module. I have also used callback function but the request function is not getting executed.

My flow goes to function searchTSTData but the request method is not getting executed.

From the callback function I am only getting responseString = 'Yet to make query rest' which I have initialized in searchTSTData function. It's not getting updated based on the response returned by API which should be either error or success response string.

I have included the modules in zip as lambda is not throwing error and passes test. Also I am sure that request module is not working as in Cloudwatch logs I don't see any console.logs i wrote inside request.

Please suggest where did I go wrong. I am new to NodeJS.

Here is the code -

'use strict';
const request = require('request');
const Alexa = require('alexa-sdk');
const APP_ID = 'amzn1.ask.skill.80a49cf5-254c-123a-a456-98745asd21456';  

const languageStrings = {
    'en': {
        translation: {
            TST: [
                'A year on Mercury is just 88 days long.',
            ],
            SKILL_NAME: 'TEST',
            GET_TST_MESSAGE: "Here's your TST: You searched for ",
            HELP_MESSAGE: 'You can say get me a TST, or, you can say exit... What can I help you with?',
            HELP_REPROMPT: 'What can I help you with?',
            STOP_MESSAGE: 'Goodbye!',
        },
    },
};

const handlers = {
    'LaunchRequest': function () {
        this.emit('GetTST');
    },
    'GetNewTSTIntent': function () {
        this.emit('GetTST');
    },
    'GetTST': function () {
        // Get a random space fact from the space facts list
        // Use this.t() to get corresponding language data
        const inputValue = this.event.request.intent.slots.Search.value;
        var finalResponse = "Some error occurred in code. Please try again later.";
        console.log('Input recieved as '+inputValue);

        searchTSTData(inputValue, function (response){
        console.log('trying to call');
                        finalResponse = response;                                                    
         });

         console.log("after function call");

        // Create speech output
        const speechOutput = this.t('GET_TST_MESSAGE')  + inputValue+". Here are the results " +finalResponse;
        this.emit(':tellWithCard', speechOutput, this.t('SKILL_NAME'), speechOutput);
    },
    'AMAZON.HelpIntent': function () {
        const speechOutput = this.t('HELP_MESSAGE');
        const reprompt = this.t('HELP_MESSAGE');
        this.emit(':ask', speechOutput, reprompt);
    },
    'AMAZON.CancelIntent': function () {
        this.emit(':tell', this.t('STOP_MESSAGE'));
    },
    'AMAZON.StopIntent': function () {
        this.emit(':tell', this.t('STOP_MESSAGE'));
    },
};

exports.handler = function (event, context) {
    const alexa = Alexa.handler(event, context);
    alexa.APP_ID = APP_ID;
    // To enable string internationalization (i18n) features, set a resources object.
    alexa.resources = languageStrings;
    alexa.registerHandlers(handlers);
    alexa.execute();
};


function searchTSTData(searchString,callback){
    var responseString = 'Yet to make query rest';

    request({
    url: 'https://api.google.com/getresultsInJson',
    method: 'GET'
    }, function (error, response, body) {
            if (error) {
                responseString = 'Error received from rest api. Please try again after some time.';
                } else if(response.statusCode===200){
                responseString = 'Sucess Success';
                }else{
                responseString = 'Nothing is working'; 
                }
            });
            callback(responseString);
           }

回答1:


is your lambda method inside a VPC? check this http://docs.aws.amazon.com/lambda/latest/dg/vpc.html you need to give external access to it




回答2:


Alexa-SDK ends your lambda's event loop when you call this.emit().

In your example, you are calling request(), which is working asynchronously. Immediately after calling request() (via searchTSTData()), you are emitting this.emit(), which ends the event loop and leaves the response unhandled.

In order to handle your response, you want to hold the call to this.emit():

const handlers = {
  'GetTST': function () {
    searchTSTData(inputValue, (response) => {
      const speechOutput = response;
      this.emit(':tell', speechOutput);
    });
  }
};

Read here about the programming model for lambda functions under nodejs: http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html



来源:https://stackoverflow.com/questions/45613412/aws-lambda-not-able-to-make-rest-call-to-external-api

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!