Почему эта AWS лямбда вызывает ошибку: ВНИМАНИЕ: Обратный вызов / ответ уже доставлен - PullRequest
2 голосов
/ 03 марта 2020
  • Я создал шлюз API + лямбда для signUp с amazon-cognito-identity-js.
  • Затем я реализовал функцию триггера Cognito для preSignUp с Typescript

Я использую Безсерверная структура для упаковки и развертывания. Среда выполнения - Node 12

+++++++

  const wrapperHandler: Handler<CognitoUserPoolEvent> = async (
    event,
    context,
    callback
  ) => {
    let error = null;

    try {
      await myAsyncFunc();
    } catch (e) {
      error = e;
    }

    callback(error, event);
  };

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

Однако это предупреждение довольно раздражает.

Код для preSignUp в CloudWatch

ПРЕДУПРЕЖДЕНИЕ: Обратный звонок / ответ уже доставлен. Ваша функция вызывала обратный вызов, а также возвращала обещание? Подробнее см. https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

В коде я ничего не возвращал до обратного вызова, почему это произошло? и как это решить.

1 Ответ

1 голос
/ 03 марта 2020

Как ваше сообщение об ошибке, что вы получили, вы смешиваете стиль обратного вызова со стилем async/await, затем выдается предупреждение.

Я предпочитаю использовать async/await. Это значит, что функция-обработчик всегда является асин c функцией (с ключевым словом asyn c), затем вместо вызова callback функции просто возвращают результат, и вам не нужен параметр callback в функции-обработчике.

В случае ошибки просто выбросить ошибку (без блока try/catch).

const wrapperHandler: Handler<CognitoUserPoolEvent> = async (
  event,
  context,
  // callback
) => {
  // let error = null;

  try {
    await myAsyncFunc();
  } catch (e) {
    // error = e;
    // Do something  with your error
    throw e;
  }

  // callback(error, event);
  return event; // just return result for handler function
};

В простом:

const wrapperHandler: Handler<CognitoUserPoolEvent> = async (
  event,
  context,
) => {
  await myAsyncFunc();

  return event;
};

...