Node.js 使用Alexa技巧的Node JS回调

Node.js 使用Alexa技巧的Node JS回调,node.js,aws-lambda,alexa,alexa-skills-kit,node-request,Node.js,Aws Lambda,Alexa,Alexa Skills Kit,Node Request,我有一个模块,其中包含一个请求调用,它似乎没有被执行 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.handl

我有一个模块,其中包含一个请求调用,它似乎没有被执行

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);
    }
}
var request=require('request');
var-Alexa=require('Alexa-sdk');
var APP_ID=;
var self=module.exports={
处理程序:函数(事件、上下文、回调){
var alexa=alexa.handler(事件、上下文);
alexa.appId=APP_ID;
alexa.registerHandlers(自我);
execute();
},
“测试内容”:功能(){
var speechOutput=“记录测试”;
请求(“http://www.google.com", 
功能(错误、响应、正文)
{ 
返回控制台日志(body);
}
);
this.emit(':tell',speechOutput);
}
}
我从未在Lambda console或其他任何地方看到google body出现在我的console.log中。我尝试过其他调用(比如我的应用程序服务器API的API帖子),但也没有在该服务器上看到

该进程似乎在请求回调完成之前关闭

在Amazon Lambda“tester”中,我得到了一个有效的响应。在Alexa“tester”中,我得到了“Recorded Test”的响应。在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;
             }
        );
    }
}
var request=require('request');
var-Alexa=require('Alexa-sdk');
var APP_ID=;
var self=module.exports={
处理程序:函数(事件、上下文、回调){
var alexa=alexa.handler(事件、上下文);
alexa.appId=APP_ID;
alexa.registerHandlers(自我);
execute();
},
“测试内容”:功能(){
var=这个;
var speechOutput=“记录测试”;
请求(“http://www.google.com", 
功能(错误、响应、正文)
{ 
控制台日志(主体);
发出(':tell',speechOutput);
返回;
}
);
}
}
您的(原始)代码无法工作,因为您正在呼叫

this.emit(':tell',speechOutput);

刚过

请求(“http://www.google.com",

:tell
函数将调用lambda回调并终止lambda函数的执行

您自己找到了解决方案:等待执行
请求
回调,然后在此时发出
:tell
事件

有关nodejs代码,请参见alexa skills kit sdk,网址为



您可以在

上了解有关Lambda编程模型的更多信息。您是否使用当前版本的Lambda(4.3)?我想知道旧版本是否会在调用回调时终止进程。我知道我使用的测试线束(节点lamdba)我认为这是因为该行为是为旧lambda设计的,尚未更新。此外,可能调用失败,正文为空。我会在其中粘贴一条明确的日志消息,以确保它确实没有被记录。还有,不相关的评论,但你不应该将alexa.appId设置为你的应用程序ID,你应该这样做验证它们是否匹配。谢谢@Tom,如果我在执行“this.emit”之前通过了一个bug,我可以在请求函数中得到一条显式的“I got here”消息。因此,如果TestIntent函数未完成,则回调有时间运行和报告。因此,我需要以某种方式获取this.emit以等待回调完成。我不同意您的最后一句话:您应该尽早发出,因为这是用户的响应。公平地说,我需要关闭服务以等待此函数最后,我想把emit应用程序放到函数中可以做到这一点,但我想还有其他的方法吗?