从 AWS Lambda Alexa Intent 中发布到 SNS,Node.js
Publishing to SNS from within AWS Lambda Alexa Intent, Node.js
我有一个用 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 代码一起工作.
我想我找到了正确的方法。
在意图中,我 post 代码,在 publish() 函数的回调中,我放置了 Alexa emit 函数。这样,应用会等待 SNS 发布成功完成,然后再继续其余的工作流程。
我用它来根据意图发送短信。
这是 Alexa Intent 中的更新代码:
'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 的发布,然后再继续向用户提示。
我有一个用 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 代码一起工作.
我想我找到了正确的方法。 在意图中,我 post 代码,在 publish() 函数的回调中,我放置了 Alexa emit 函数。这样,应用会等待 SNS 发布成功完成,然后再继续其余的工作流程。 我用它来根据意图发送短信。
这是 Alexa Intent 中的更新代码:
'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 的发布,然后再继续向用户提示。