[英]Alexa API request through lambda function
I am creating an Alexa skill and have hosted my NodeJS code through AWS Lambda. 我正在创建一个Alexa技能并通过AWS Lambda托管我的NodeJS代码。
I need to access data from an API and pull it into my Lambda function to serve back to Alexa. 我需要从API访问数据并将其拉入我的Lambda函数以回送给Alexa。 How can I use packages like Express or, perhaps jQuery, to allow for API requests through my Lambda function?
我如何使用Express或者jQuery这样的包来通过我的Lambda函数允许API请求?
I've found verbose/complex ways of installing npm
packages, but was looking if there was a better / different way of doing this 我已经找到了安装
npm
软件包的详细/复杂方法 ,但是看看是否有更好/不同的方式来做这个
I used the nodeJS
http
request. 我使用了
nodeJS
http
请求。 Including this request within the getWelcomeResponse()
and testing within Alexa Dev, I get 在
getWelcomeResponse()
包含此请求并在Alexa Dev中进行测试,我得到了
The remote endpoint could not be called, or the response it returned was invalid.
无法调用远程端点,或者它返回的响应无效。
Without the HTTP request, it returns an expected json response 如果没有HTTP请求,它将返回预期的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 Error logs: Cloudwatch错误日志:
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
. 错误是
getaddrinfo ENOTFOUND at errnoException (dns.js:37:11) at Object.onanswer
。 I don't quite understand this error. 我不太明白这个错误。
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. 如果您只需要进行HTTP调用,这将内置到NodeJS中,您无需在Lambda中安装任何额外的包。 Look at the answer to this question: Sending http request in node.js
看看这个问题的答案: 在node.js中发送http请求
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.