2016-10-18 35 views
2

我有一个包含请求调用的模块,该调用似乎没有得到执行。具有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; 
      } 
     ); 
    } 
} 
+0

了解拉姆达编程模型,您使用的是最新版本lambda(4.3)的?我想知道当你调用回调时,旧版本是否会杀死进程。我知道我使用的测试工具(node-lamdba)会这样做,我认为它是因为这种行为是为旧的lambda设计的,并且尚未更新。 – Tom

+0

此外,也许呼叫失败,身体是空的。我会在那里粘贴一个明确的日志消息,以确保它确实没有被记录。而且,无关的评论,但你不应该将alexa.appId设置为你的APP_ID,你应该验证它们是否匹配。 – Tom

+0

谢谢@Tom,我可以在请求函数中获得一个明确的“我在这里”消息,以显示在执行“this.emit”之前是否通过了一个错误。所以如果TestIntent函数没有完成,回调就有时间运行和报告。所以我需要以某种方式让this.emit等待回调完成 – probbins222

回答

2

你(原)代码是不工作,因为你只是右后 request("http://www.google.com",

:tell函数调用 this.emit(':tell', speechOutput);

将调用拉姆达回调并终止lambda函数的执行。

您自己找到了解决方案:等待request回调被执行,并在此时发出:tell事件。

见ALEXA技能-KIT-SDK换的NodeJS代码在
https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/blob/master/lib/response.js#L6

https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/blob/master/lib/response.js#L101

您可以在http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html