2017-05-12 137 views
2

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

这是独立的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(){}); 
}; 

如果我再尝试把我的Alexa的lambda函数的函数内的SNS代码,它不执行。其余的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(); 
}; 

如果我注释掉所有的Alexa的东西在exports.handler函数,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码。

回答

2

我想我想出了这样做的正确方法。 在intent里面我发布了代码,并且在publish()函数的回调函数中,我放置了Alexa emit函数。这样,在继续完成其余工作流程之前,应用程序会等待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与提示给用户,然后再继续。