从AWS Lambda Alexa Intent,Node.js中发布到SNS

我有一个用Node.js编写的Lambda函数,可以成功发布到SNS。 当我在Alexa Lambda函数的Alexa意图中使用相同的函数时,只有在注释掉代码的Alexa部分时才会执行该函数。

这是独立的Lambda函数:

var AWS = require("aws-sdk"); exports.handler = function() { var sns = new AWS.SNS(); var params = { Message: "Cheese", Subject: "Test SNS From Lambda", TopicArn: "arn:aws:sns:us-east-1:xxxxxxx:MyTopic" }; sns.publish(params, function(){}); }; 

如果我然后尝试将SNS代码放入我的Alexa lambda函数的函数中,则不会执行。 Alexa代码的其余部分工作正常,但没有发布到SNS。 如果我把它的Alexa部分注释掉,它确实有效。

这是不起作用的代码(aws-sdk包含在文件的顶部,在本例中省略):

 exports.handler = function(event, context) { var sns = new AWS.SNS(); var params = { Message: "Cheese", Subject: "Test SNS From Lambda", TopicArn: "arn:aws:sns:us-east-1:xxxxxxx:MyTopic" }; sns.publish(params, function(){}); const alexa = Alexa.handler(event, context); alexa.APP_ID = APP_ID; alexa.resources = languageStrings; alexa.registerHandlers(newSessionHandlers, memberModeHandlers); alexa.execute(); }; 

如果我在exports.handler函数中注释掉所有Alexa的东西,SNS发布就可以工作,但显然应用的其余部分会失败。

像这样,这将工作:

 exports.handler = function(event, context) { var sns = new AWS.SNS(); var params = { Message: "Cheese", Subject: "Test SNS From Lambda", TopicArn: "arn:aws:sns:us-east-1:xxxxxxx:MyTopic" }; sns.publish(params, function(){}); /* const alexa = Alexa.handler(event, context); alexa.APP_ID = APP_ID; // To enable string internationalization (i18n) features, set a resources object. alexa.resources = languageStrings; alexa.registerHandlers(newSessionHandlers, memberModeHandlers); alexa.execute(); */ }; 

有什么想法在这里发生了什么? 理想情况下,我想要做的就是将sns发布代码放在一个单独的函数中,然后我从Alexa技能中的某个点调用一个意图调用,但是目前为止我不能使这个东西与Alexa代码一起工作。

我想我找出了正确的做法。 里面的意图我张贴的代码,并在发布()函数的callback,我把Alexa的发射function。 这样,在继续完成其余的工作stream程之前,应用程序会等待SNS发布成功完成。 我用这个来发送一个基于意图的短信。

这是Alexa意图中的更新代码:

 'MessageMemberIntent' : function () { var sns = new AWS.SNS(); var message = "test foo"; var params = { Message: message, Subject: "Test SNS From Lambda", TopicArn: "arn:aws:sns:us-east-1:xxxxxx:MyTopic" }; sns.publish(params, (() => { this.emit(':ask', 'Ok, sending the message to the member'); })); } 

在继续向用户提示之前,这将完成向SNS的发布。