我有一个用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代码一起工作
答案 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的发布,然后继续向用户发出提示。