从AWS Lambda Alexa Intent,Node.js

时间:2017-05-12 00:40:13

标签: node.js aws-lambda amazon-sns alexa alexa-skills-kit

我有一个用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技能期间的某个点调用的intent调用,但到目前为止,我无法使这个函数与Alexa代码一起工作

1 个答案:

答案 0 :(得分:2)

我想我找到了正确的方法。 在意图内部我发布了代码,并在publish()函数的回调中我放了Alexa发射函数。这样,应用程序等待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的发布,然后继续向用户发出提示。