Отдельная лямбда-функция AWS для ответа на запросы навыков Alexa и возврата объекта JSON, в зависимости от того, как он называется - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь использовать одну и ту же лямбда-функцию AWS для двух операций с одним и тем же набором данных DynamoDB.

(a) Предоставьте ответы по навыку Алексы

Я уже реализовал это, и Навык работает правильно. Я использую 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, суммирующий некоторое содержимое базы данных

Код NodeJS, который я настроил для навыка Alexa, обрабатывает данные DynamoDB для предоставления ответов навыка. Я хочу использовать одну и ту же кодовую базу (то есть ту же функцию Lambda) для создания сводок для моей собственной выгоды. Я не хочу копировать и вставлять кусочки лямбда-функции в отдельную функцию. Я бы предпочел, чтобы один и тот же код выполнял обе задачи, чтобы все было в порядке.

Моя проблема в том, что структура лямбда-кода для возврата этого JSON-ответа на мой запрос выглядит следующим образом: 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  */ }

Из того, что я могу разглядеть, каждая лямбда-функция (в смысле каждого номера ресурса Amazon для лямбда-функции) должна иметь только один входной файл, т.е. я не могу заставить лямбду начинать index_Alexa.js против index_JSON.js ,

Я открыт для любых предложений о том, как заставить одну и ту же функцию Lambda (в смысле одного и того же файла JS или пакета файлов) делать обе вещи.

1 Ответ

0 голосов
/ 02 сентября 2018

Я несколько сомневаюсь в полезности этого подхода, и у следующего есть некоторый потенциал для оптимизации, но один из способов сделать это - объявить 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 Gateway предполагают , что это значение всегда будет присутствовать.

...