Простой лямбда-ответ AWS равен нулю, если обратный вызов вызывается в другом контексте - PullRequest
0 голосов
/ 28 января 2019

У меня были проблемы с запуском некоторого кода, который я написал, используя AWS Lambda с NodeJS.Мне потребовалось некоторое время, чтобы сузить мою проблему, но в конечном итоге я заметил, что если я вызываю функцию обратного вызова из контекста, отличного от контекста функции-обработчика, то значение ответа равно нулю.

Вот простая функция Iиспользуется для проверки этого

exports.handler = async (event, context, callback) => {
  callback (null,{
        statusCode: 201,
        headers: {
          "Content-Type": "text/html"
        },
        body: {}
  });
}

Если я запускаю тестовое событие с этим кодом (тестовый сценарий - пустой JSON), то результат будет просто:

Response:
{
  "statusCode": 201,
  "headers": {
    "Content-Type": "text/html"
  },
  "body": {}
}

Однако если я только принудительно вызываю функцию обратного вызова в другом контексте, как в примере ниже:

exports.handler = async (event, context, callback) => {    
    setTimeout(function() {
        callback (null,{   // <-- callback is now called in timer context
            statusCode: 201,
            headers: {
              "Content-Type": "text/html"
            },
            body: {}
      })}, 5000);
}

Тогда выполнение точно такого же тестового события (пустой JSON) теперь приводит к нулевому ответу:

Response:
null

Теперь это кажется мне очень простой функциональностью, я просто предполагаю, что здесь что-то упущено.Кто-нибудь может помочь определить мою ошибку?или объясните, как значение ответа может содержать обязательные значения, даже если обратный вызов вызывается в другом контексте?Спасибо!

Synchronous code with working result Asynchronous code with null response Test event - empty JSON object

Обновление # 1 Протестировано еще раз с использованием обещания:

Another test with promise

1 Ответ

0 голосов
/ 29 января 2019

Ваш код будет возвращен непосредственно перед вызовом обратных вызовов.Вот почему это работает в первом примере.

Попробуйте добавить await в начало вашего примера Promise, чтобы узел завершил работу, прежде чем двигаться дальше.

const value = await delay(5000)
callback(null, value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...