2
votes

I am creating an Alexa skill and have hosted my NodeJS code through AWS Lambda.

I need to access data from an API and pull it into my Lambda function to serve back to Alexa. How can I use packages like Express or, perhaps jQuery, to allow for API requests through my Lambda function?


I've found verbose/complex ways of installing npm packages, but was looking if there was a better / different way of doing this

I used the nodeJS http request. Including this request within the getWelcomeResponse() and testing within Alexa Dev, I get

The remote endpoint could not be called, or the response it returned was invalid.

Without the HTTP request, it returns an expected json response

 function getWelcomeResponse(callback) {

    console.log('GET WELCOME RESPONSE');

    var options = {
        host: 'http://clg-api-dev.elasticbeanstalk.com',
        port: 7474,
        path: '/1.0/leveldata/3',
        method: 'GET',
        headers: {
            accept: 'application/json'
        }
    };

    var x = http.request(options,function(res){
        console.log("Connected");

        res.on('data',function(data){

            console.log('My Data: ', data);

            var sessionAttributes = {},
            speechOutput = "Reindeer Games. I will ask you " + GAME_LENGTH.toString()
                + " questions, try to get as many right as you can. Just say the number of the answer. Let's begin. ",
            shouldEndSession = false,

            gameQuestions = populateGameQuestions(),

            sessionAttributes = {
                "speechOutput": repromptText,
                "repromptText": repromptText,
                "currentQuestionIndex": currentQuestionIndex,
                "correctAnswerIndex": correctAnswerIndex + 1,
                "questions": gameQuestions,
                "score": 0,
                "correctAnswerText":
                    questions[gameQuestions[currentQuestionIndex]][Object.keys(questions[gameQuestions[currentQuestionIndex]])[0]][0]
            };
            callback(sessionAttributes, buildSpeechletResponse(CARD_TITLE, speechOutput, repromptText, shouldEndSession));

        });
    });

    x.end();
}

Cloudwatch Error logs:

START RequestId: e293453f-fc30-11e5-ae18-8723f88b4bb0 Version: $LATEST 
2016-04-06T19:50:59.657Z    e293453f-fc30-11e5-ae18-8723f88b4bb0    event.session.application.applicationId=amzn1.echo-sdk-ams.app.e8233bb6-ce2d-4a6c-8f82-e947d58d3bad 
2016-04-06T19:50:59.767Z    e293453f-fc30-11e5-ae18-8723f88b4bb0    onLaunch requestId=EdwRequestId.f6baa34c-bfc1-4758-b74d-9874d970c10e, sessionId=SessionId.7063c3b5-b2c0-4b1d-9180-d79aaeed9a49 
2016-04-06T19:50:59.768Z    e293453f-fc30-11e5-ae18-8723f88b4bb0    GET WELCOME RESPONSE 
2016-04-06T19:50:59.934Z    e293453f-fc30-11e5-ae18-8723f88b4bb0    Error: getaddrinfo ENOTFOUND at errnoException (dns.js:37:11) at Object.onanswer [as oncomplete] (dns.js:126:16) 
END RequestId: e293453f-fc30-11e5-ae18-8723f88b4bb0 
REPORT RequestId: e293453f-fc30-11e5-ae18-8723f88b4bb0  Duration: 315.42 ms Billed Duration: 400 ms Memory Size: 128 MB Max Memory Used: 14 MB   
Process exited before completing request 

Where the error is getaddrinfo ENOTFOUND at errnoException (dns.js:37:11) at Object.onanswer. I don't quite understand this error.

1

1 Answers

0
votes

If you just need to make an HTTP call, this is built into NodeJS and you don't need to install any extra packages in Lambda. Look at the answer to this question: Sending http request in node.js