我试图使用相同的AWS Lambda函数使用相同的DynamoDB数据集执行两项操作。
我已经实现了这个,并且技能正常运行。我正在使用NodeJS和Amazon Skills Kit版本2.我的index.js的最后几行如下:
const skillBuilder = Alexa.SkillBuilders.standard();
exports.handler = skillBuilder
.addRequestHandlers(
LaunchRequest,
HelpIntent,
// .... various other intents
UnhandledIntent
)
.addErrorHandlers(ErrorHandler)
.lambda();
我为Alexa技能设置的NodeJS代码,处理DynamoDB数据以提供技能响应。我想使用相同的代码库(即相同的Lambda函数)来生成摘要以供我自己使用。我不想将Lambda函数的片段复制粘贴到单独的函数中。我宁愿让相同的代码执行这两项任务,以便将所有内容保持在一步。
我的问题是,用于将此JSON响应返回给我的请求的Lambda代码的结构如下,来自https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html:
'use strict';
console.log('Loading hello world function');
exports.handler = function(event, context, callback) {
let name = "you";
let city = 'World';
// etc ... more code ...
callback(null, response);
};
我想我想达到这个效果:
if ( /* test whether being called by Alexa or by API Gateway */ )
{ /* Make the Alexa Response */ }
else
{ /* Construct the JSON data summary response */ }
从我可以看出,每个Lambda函数(在Lambda函数的每个Amazon资源编号的意义上)必须只有一个条目文件,即我不能使Lambda启动index_Alexa.js
而不是index_JSON.js
。
我对任何关于如何获得相同的Lambda函数(在相同的JS文件或文件包的意义上)做任何事情的建议持开放态度。
我在某种程度上质疑了这种方法的有用性,并且以下有一些优化剩余的可能性,但实现这一点的一种方法是将exports.handler
声明为一个简单的包装器,它根据你可以测试的条件调用正确的先前声明的处理函数。请求。
// set up handler for alexa
const skillBuilder = Alexa.SkillBuilders.standard();
const alexa_handler = skillBuilder
.addRequestHandlers(
LaunchRequest,
HelpIntent,
// .... various other intents
UnhandledIntent
)
.addErrorHandlers(ErrorHandler)
.lambda();
// set up handler for API Gateway
const api_gateway_handler = function(event, context, callback) {
let name = "you";
let city = 'World';
// etc ... more code ...
callback(null, response);
};
// for each invocation, choose which of the above to invoke
exports.handler = function(event, context, callback) {
if(/* some test that is true only for API Gateway */)
{
api_gateway_handler(event, context, callback);
}
else
{
alexa_handler(event, context, callback);
}
};
线if(/* some test that is true only for API Gateway */)
是你需要解决的问题,但我怀疑这样的事情可能有用:
if(event.input && event.input.requestContext && event.input.requestContext.apiId)
API网关向suggest说明该值始终存在。