2016-04-06 10 views
1

Ich erstelle eine Alexa-Fähigkeit und habe meinen NodeJS-Code durch AWS Lambda gehostet.Alexa API-Anfrage durch Lambda-Funktion

Ich muss auf Daten von einer API zugreifen und es in meine Lambda-Funktion ziehen, um zurück zu Alexa zu dienen. Wie kann ich Pakete wie Express oder vielleicht jQuery verwenden, um API-Anfragen über meine Lambda-Funktion zu ermöglichen?


habe ich verbose/complex ways die Installation npm Pakete gefunden, aber war auf der Suche, wenn ich verwenden, um die nodeJShttp Anfrage

eine bessere/andere Art und Weise ist, dies zu tun. Einschließlich dieser Aufforderung innerhalb der getWelcomeResponse() und Prüfung innerhalb Alexa Dev, erhalte ich

Der Remote-Endpunkt kann nicht aufgerufen werden, oder die Antwort es ungültig war zurückgekehrt.

Ohne die HTTP-Anforderung gibt es eine erwartete Antwort json

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 Fehlerprotokolle:

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 

Wo der Fehler getaddrinfo ENOTFOUND at errnoException (dns.js:37:11) at Object.onanswer ist. Ich verstehe diesen Fehler nicht ganz.

Antwort

0

Wenn Sie nur einen HTTP-Aufruf durchführen müssen, ist dies in NodeJS integriert und Sie müssen keine zusätzlichen Pakete in Lambda installieren. Sehen Sie sich die Antwort auf diese Frage an: Sending http request in node.js

+0

Fair genug, es wäre schön, ein Paket zu verwenden. Also habe ich die HTTP-Anfrage 'node' verwendet, in die Funktion getWelcomeResponse (callback)' Lambda 'getwelcomeResponse gestellt, und wenn ich sie in Alexa Dev getestet habe, hat sie zurückgegeben' Der entfernte Endpunkt konnte nicht aufgerufen werden oder die Antwort war ungültig .' Ohne die HTTP-Anfrage gibt es eine erwartete 'json'-Antwort zurück – Growler

+0

Warum wäre es schön, ein Paket zu verwenden? Nur um Ihren Bereitstellungsprozess zu vereinfachen? Oder meinst du, es wäre schön, ein Framework zu verwenden, das die Dinge irgendwie einfacher macht? Ich habe das Gefühl, dass die integrierte NodeJS-Funktion genauso einfach ist wie die Verwendung der jQuery AJAX-Funktion in einem Browser. –

+0

Sie müssen auch das Protokoll für den fehlgeschlagenen Funktionsaufruf aus CloudWatch abrufen und hier veröffentlichen. Oder lesen Sie es einfach und sehen Sie, was Ihr Fehler ist. –

Verwandte Themen