Приходится проверять лямбду несколько раз, прежде чем она заработает - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть лямбда-функция, с которой я играю. Он вставляет очень основную информацию в таблицу DynamoDB. Вот код:

'use strict';
const alexaSkillKit = require('alexa-skill-kit');
const AWS = require('aws-sdk');

function binDaySkill(event, context, callback) {
    alexaSkillKit(event, context, (message) => {

        let params = {
            Item:      {
                user_id:       '123',
                some_data: 'some data here'
            },
            TableName: 'my_table'
        };

        let documentClient = new AWS.DynamoDB.DocumentClient();

        documentClient.put(params, function (err, data) {
            if (err) {
                callback("Error", err);
            } else {
                callback(null, data);
            }
        });

    });
}

Проблема, с которой я столкнулся, заключается в том, что только иногда сохраняет данные в БД. Я должен щелкнуть тест 5-10 раз, прежде чем он что-то сделает.

Может кто-нибудь помочь с тем, что может быть причиной этого?

1 Ответ

0 голосов
/ 08 ноября 2018

Причина, по которой это происходит, в том, что alexa-skill-kit позаботится о вашем обратном вызове.

См. Документацию . Передавая объект context, вы позволяете обработчику упаковки (alexaSkillKit(...)) управлять декодированием и кодированием возвращаемых объектов и полезной нагрузки. Функция обратного вызова обработчика alexSkillKit ожидает от вас возврата значения.

Для вашего примера кода вы можете сделать следующее:

'use strict';
const alexaSkillKit = require('alexa-skill-kit');
const AWS = require('aws-sdk');

function binDaySkill(event, context, callback) {
  alexaSkillKit(event, context, (message) => {
    let params = {
      Item: {
        user_id: '123',
        some_data: 'some data here'
      },
      TableName: 'my_table'
    };

    let documentClient = new AWS.DynamoDB.DocumentClient();

    return documentClient.put(params).promise()
      .then((data) => {
        // stuff with the data!
        return data;
      }).catch((err) => {
        // stuff with the error
        throw err;
      });  
  });
}

n.b. Причина, по которой он работал после нескольких вызовов, заключается в том, что лямбда повторно использует среды, в которых выполняется каждый вызов. Он делает это, эффективно «замораживая» состояние среды и оттаивая его, когда это необходимо снова. Это основа многих оптимизаций, которые делают люди; и это означало, что вы иногда оттаивали среду, находившуюся на полпути через обратный вызов, когда он был заморожен alexaSkillKit, возвращающимся первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...