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

Я пытаюсь запустить небольшой фрагмент лямбда-кода, где я отправляю данные на S3 с помощью пожарного шланга. Вот мой фрагмент

const AWS = require( 'aws-sdk' );
var FIREhose = new AWS.Firehose();
exports.handler = async (event,context,callback) => {
    // TODO implement
    const response = {
        statusCode:200,
        Name:event.Name,
        Value:event.Value
    };
const params = {
  DeliveryStreamName: 'kinesis-firehose', 
  Record: { Data: new Buffer(JSON.stringify(response)) }
};

FIREhose.putRecord(params, (err, data) => {
if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);
});
};

Вот мои события

{
  "Name": "Mike",
  "Value": "66"
}

Когда я запускаю эту лямбду, я получаю ответ как null. Поскольку я не передаю никакой обратный вызов, лямбда по умолчанию запускает неявный обратный вызов и возвращает ноль. Я вижу, что данные не передаются в корзину S3. Но когда я добавляю callback(null,"success") строку в конце, как это

FIREhose.putRecord(params, (err, data) => {
if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);
});
callback(null,"success")
};

Я вижу, что данные передаются на S3. Это почему ? Всегда ли функциям async нужен обратный вызов с добавленным к нему текстом? Любая помощь приветствуется? Спасибо

1 Ответ

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

Проблема в том, что вы смешиваете свои узлы лямбда-узла node.js.

Либо вы используете асинхронную функцию и возвращаете или бросаете:

exports.handler = async (event,context,callback) => {
  // code goes here.

  await FIREhose.putRecord(params).promise();
  return null; // or whatever result.
};

или вы используете метод обратного вызова:

exports.handler = (event,context,callback) => {
  // code goes here.

  FIREhose.putRecord(params)
    .promise();
    .then((data) => {
      // do stuff with data.
      // n.b. you could have used the cb instead of a promise here too.
      callback(null, null); // or whatever result.
    });
};

(есть третий способ использования context., но это очень устаревший способ).

Это все из-за того, как работает лямбда и определяет, когда был ответ.

В вашем первом примере (без обратного вызова) lambda ожидает, что ваш обработчик вернет обещание, которое он должен ждать для разрешения / отклонения, что, в свою очередь, будет ответом. Однако вы не возвращаете обещание (undefined), поэтому ждать нечего, и оно немедленно возвращается - вполне вероятно, до того, как завершится вызов putRecord.

Когда вы использовали callback, вы явно сказали лямбде, что используете «старый» способ. Интересная особенность подхода callback заключается в том, что ожидает завершения цикла событий узла (по умолчанию). Это означает, что .putRecord, вероятно, завершится.

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