我有一个包含请求调用的模块,该调用似乎没有得到执行。具有Alexa技能的节点JS回调
var request = require('request');
var Alexa = require('alexa-sdk');
var APP_ID = <my alexa app ID>;
var self = module.exports = {
handler : function (event, context, callback) {
var alexa = Alexa.handler(event, context);
alexa.appId = APP_ID;
alexa.registerHandlers(self);
alexa.execute();
},
"TestIntent": function() {
var speechOutput = "Recorded Test";
request("http://www.google.com",
function(error, response,body)
{
return console.log(body);
}
);
this.emit(':tell', speechOutput);
}
}
我从来没有看到谷歌的身体在我的拉姆达控制台或其他地方上的console.log露面。我尝试了其他调用(例如API到我的应用程序服务器API),但没有看到在该服务器上显示的内容。
似乎在请求回调完成之前进程正在关闭。
在亚马逊Lambda“测试人员”中,我收到了有效的答复。在Alexa的“测试人员”中,我找回了“记录测试”的回应。在Echo上(通过Alexa),我从设备中取回“记录测试”响应。所以这个技能似乎很好。这只是失败的“请求”操作(在这种情况下,只是拉动google.com)。
谢谢!
更新:我至少能够完成呼叫,但可能不是最干净的方式。
var request = require('request');
var Alexa = require('alexa-sdk');
var APP_ID = <my alexa app ID>;
var self = module.exports = {
handler : function (event, context, callback) {
var alexa = Alexa.handler(event, context);
alexa.appId = APP_ID;
alexa.registerHandlers(self);
alexa.execute();
},
"TestIntent": function() {
var that = this;
var speechOutput = "Recorded Test";
request("http://www.google.com",
function(error, response,body)
{
console.log(body);
that.emit(':tell', speechOutput);
return;
}
);
}
}
了解拉姆达编程模型,您使用的是最新版本lambda(4.3)的?我想知道当你调用回调时,旧版本是否会杀死进程。我知道我使用的测试工具(node-lamdba)会这样做,我认为它是因为这种行为是为旧的lambda设计的,并且尚未更新。 – Tom
此外,也许呼叫失败,身体是空的。我会在那里粘贴一个明确的日志消息,以确保它确实没有被记录。而且,无关的评论,但你不应该将alexa.appId设置为你的APP_ID,你应该验证它们是否匹配。 – Tom
谢谢@Tom,我可以在请求函数中获得一个明确的“我在这里”消息,以显示在执行“this.emit”之前是否通过了一个错误。所以如果TestIntent函数没有完成,回调就有时间运行和报告。所以我需要以某种方式让this.emit等待回调完成 – probbins222