单个AWS Lambda函数,用于响应Alexa技能请求,并根据其调用方式返回JSON对象

问题描述 投票:0回答:1

我试图使用相同的AWS Lambda函数使用相同的DynamoDB数据集执行两项操作。

(a)提供Alexa技能回应

我已经实现了这个,并且技能正常运行。我正在使用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();

(b)提供总结一些数据库内容的JSON对象

我为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);
 };

这两段代码都为`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文件或文件包的意义上)做任何事情的建议持开放态度。

aws-lambda nodes aws-api-gateway alexa-skills-kit
1个回答
1
投票

我在某种程度上质疑了这种方法的有用性,并且以下有一些优化剩余的可能性,但实现这一点的一种方法是将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说明该值始终存在。

© www.soinside.com 2019 - 2024. All rights reserved.