我对 lambda函数有两个疑问。
我尝试制作 Alexa技能,从this网站获取一些数据,然后根据用户的请求进行一些操作。
request
在 aws服务器上完成,(因为我看不到 log < / strong>在我的函数内打印在服务器上的日志中)。 这是我用来从网站获取数据的代码:
console.log("Initiating request");
request({
url: url,
json: true
}, function(error, response, body){
console.log("Request send, waiting to load the data..."); // Not executed
if(!error && response.statusCode == 200){
console.log("Data obtained :: ");
data = body;
console.log(data.toString());
});
}
else{
console.log("Error: " + error.message);
}
});
Here是任何进一步参考的完整代码。
这是执行的日志输出:
START RequestId:621ee488-f187-11e7-b063-99e0641d97b4版本:$ LATEST 2018-01-04T19:42:23.742Z 621ee488-f187-11e7-b063-99e0641d97b4 GetNewContestIntent 2018-01-04T19:42:23.778Z 621ee488-f187-11e7-b063-99e0641d97b4数据 由用户给出:undefined undefined undefined undefined undefined 2018-01-04T19:42:23.798Z 621ee488-f187-11e7-b063-99e0641d97b4您好 2018-01-04T19:42:26.419Z 621ee488-f187-11e7-b063-99e0641d97b4启动 请求 2018-01-04T19:42:26.481Z 621ee488-f187-11e7-b063-99e0641d97b4这里有 一些比赛:END RequestId:621ee488-f187-11e7-b063-99e0641d97b4 报告RequestId:621ee488-f187-11e7-b063-99e0641d97b4持续时间: 2808.73 ms结算时长:2900 ms内存大小:128 MB最大使用内存:47 MB
(未定义的值是可以接受的,我希望它们是"undefined"
)。
第二个很奇怪,我不知道为什么它发生在我身上。
npm install request
函数运行,我必须执行request
,并且必须上传我的lambda函数和sdk的zip文件。但正因为如此,我无法使用编辑代码内嵌选项编辑我的代码。如果我选择该选项,它不会显示任何内容。虽然我可以看到编辑器的其他功能。这不是一个真正的问题,但每次我在代码中进行任何更改时都必须上传完整的代码,这很麻烦。任何人都可以帮我解决这些问题吗?谢谢。
答案 0 :(得分:1)
一般来说,问题是你在请求完成之前正在回复this.emit(':responseReady');
,这是因为在你的代码的这一部分你调用执行请求的request
,但是你在那里定义处理响应的function
将被执行async,所以在此之前程序将继续请求if(invalidRequest)
之后的下一个命令,依此类推,直到几行之后达到alexa的响应。
console.log("Initiating request");
request({
url: url,
json: true
}, function(error, response, body){
console.log("Request send, waiting to load the data...");
...
});
if(invalidRequest){
speechOutput = errorMessage;
}else{
speechOutput = GET_CONTEST_MESSAGE + ans;
}
console.log(speechOutput);
this.response.cardRenderer(SKILL_NAME, speechOutput);
this.response.speak(speechOutput);
this.emit(':responseReady');
这可以通过两种方式解决。如果您的alexa的答案需要来自请求的数据,那么您应该为您的请求发出回调函数的响应。 Here是此实施的一些示例。
另一种选择是,如果您回答不一定需要数据,也许您要求alexa处理数据,她只会说数据正在处理中。对于这种情况,我会在不同的lambda函数中处理请求和数据,而intent
将调用另一个将自行运行的lambda。 Here是一个文本,可以帮助您从另一个lambda调用一个lambda,并更好地了解这个问题是如何发生的。
您还可以查找工具以方便将代码上传到lambda,我正在使用的是Serverless