Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Aws lambda 单个AWS Lambda函数响应Alexa skill请求,并根据调用方式返回JSON对象_Aws Lambda_Nodes_Aws Api Gateway_Alexa Skills Kit - Fatal编程技术网

Aws lambda 单个AWS Lambda函数响应Alexa skill请求,并根据调用方式返回JSON对象

Aws lambda 单个AWS Lambda函数响应Alexa skill请求,并根据调用方式返回JSON对象,aws-lambda,nodes,aws-api-gateway,alexa-skills-kit,Aws Lambda,Nodes,Aws Api Gateway,Alexa Skills Kit,我试图使用相同的AWS Lambda函数对相同的DynamoDB数据集执行两件事情 a提供Alexa技能回答 我已经实现了这一点,并且技能操作正确。我正在使用NodeJS和Amazon技能工具包版本2。my index.js的最后几行如下: const skillBuilder = Alexa.SkillBuilders.standard(); exports.handler = skillBuilder .addRequestHandlers( LaunchRequest,

我试图使用相同的AWS Lambda函数对相同的DynamoDB数据集执行两件事情

a提供Alexa技能回答 我已经实现了这一点,并且技能操作正确。我正在使用NodeJS和Amazon技能工具包版本2。my index.js的最后几行如下:

const skillBuilder = Alexa.SkillBuilders.standard();
exports.handler = skillBuilder
  .addRequestHandlers(
    LaunchRequest,
    HelpIntent,
    // .... various other intents
    UnhandledIntent
  )
  .addErrorHandlers(ErrorHandler)
  .lambda();
b提供一个JSON对象,总结一些数据库内容 我为Alexa skill设置的NodeJS代码处理DynamoDB数据以提供技能响应。我想使用相同的代码库,即相同的Lambda函数来生成摘要,以利于我自己。我不想将Lambda函数的粘贴片段复制到单独的函数中。我更愿意用相同的代码来完成这两项任务,以保持一切同步

我的问题是,用于向我的请求返回此JSON响应的Lambda代码的结构如下所示:

这两段代码都为“exports.handler”分配了一个函数` 我想我要达到这个效果:

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声明为一个简单的包装器,它根据您可以在请求中测试的条件调用以前声明的正确处理程序函数

//为alexa设置处理程序 const skillBuilder=Alexa.SkillBuilders.standard; 常量alexa_handler=skillBuilder .addRequestHandlers 发射请求, 帮助意图, // .... 各种其他意图 未处理的 .addErrorHandlersErrorHandler lambda先生; //为API网关设置处理程序 const api\u gateway\u handler=函数事件、上下文、回调{ 让名字=你; 让城市=世界; //等等…更多代码。。。 callbacknull,response; }; //对于每个调用,选择要调用的上面哪一个 exports.handler=函数事件、上下文、回调{ 如果/*某些测试仅对API网关有效*/ { api\u网关\u句柄事件、上下文、回调; } 其他的 { alexa_handlerevent、上下文、回调; } }; 如果/*某个测试只对API网关*/有效,则需要解决这一问题,但我怀疑类似的问题可能会奏效:

if(event.input && event.input.requestContext && event.input.requestContext.apiId)

API网关记录此值将始终存在。

谢谢!是的,我同意这是有点奇怪,有什么感觉像两条不同的河流流经一个单一的点。最后,我希望有三个文件:任务A、任务B和常见的东西,然后触发A或B。然而,目前Lambda函数似乎不可能实现。这个解决方案现在不需要重复代码就可以做到这一点!非常感谢你,迈克尔。
if(event.input && event.input.requestContext && event.input.requestContext.apiId)