Функция Asyn c в NodeJS EventEmitter on AWS Lambda - PullRequest
1 голос
/ 15 апреля 2020

У меня есть AWS Lambda-приложение, построенное на внешней библиотеке, содержащей EventEmitter. На определенное событие мне нужно сделать HTTP-запрос. Итак, я использовал этот код (упрощенно):

myEmitter.on("myEvent", async() => {
    setup();
    await doRequest();
    finishingWork();
});

Я понимаю, что происходит следующее:

Мой обработчик вызывается, но как только вызывается функция doRequest, Обещание возвращается, и EventEmitter продолжается со следующими обработчиками. Когда все это будет сделано, работа обработчика может продолжиться (finishingWork).

Это работает локально, потому что мой процесс NodeJS продолжает работать и обрабатываются все оставшиеся события в eventl oop. Странно то, что это не работает на AWS Lambda. Даже если для context.callbackWaitsForEmptyEventLoop установлено значение true.

В моем журнале я вижу, что мой обработчик входит в функцию doRequest, но ничего после того, как я вызываю библиотеку для выполнения HTTP-вызова (request-promise, который использует request). И код не продолжается, когда я делаю другой запрос (который я ожидаю, если для callbackWaitsForEmptyEventLoop установлено значение false, а это не так).

Кто-нибудь испытывал нечто подобное и знает, как выполнить асинхронный HTTP-запрос в обработчике источника событий NodeJS, на AWS Lambda?

1 Ответ

0 голосов
/ 20 апреля 2020

Если вы знаете, как решить эту проблему, не стесняйтесь добавить еще один ответ. Но на данный момент «решением» для нас было поместить код обработчика событий в другое место нашей кодовой базы. Таким образом, он выполняется асинхронно.

Мы смогли сделать это, потому что есть только одно место, где генерируется событие, но способ обработки событий был бы более чистым решением. К сожалению, не похоже, что это возможно.

...