Я создал лямбда-функцию Node.js для AWS, используя инфраструктуру Serverless для увеличения различных счетчиков в базе данных Postgres на основе параметров событий.Сама функция запускается без каких-либо ошибок при вызове с serverless invoke local
, она работает и работает, как и ожидалось, однако, при вызове из Java, в то время как она должна завершиться и вернуться, она просто отключается.
Я пробовалнесколько вещей, в том числе ожидание закрытия пула Postgres, увеличение времени ожидания, возврат с помощью функции обратного вызова (что, тем не менее, является хорошей практикой, так как становится более ясно, что функция заканчивается там), и использование цепочек обещаний вместо async-await,без удачиНа самом деле вопрос в том, как это работает, и мне всегда нужно добавлять callbackWaitsForEmptyEventLoop(false)
или есть более элегантное решение?Я даже попробовал пакет «почему работает узел», и в нем говорится, что 4 дескриптора поддерживают выполнение процесса: TCPWRAP, Timeout и два объекта TickObject.Я почти уверен, что это вызвано node-postgres, так как я создал несколько лямбда-функций, страдающих от одной и той же проблемы.
// These are the last lines of the handler function
const insertQueries = [
// Multiple queries using a node-postgres pool, e.g.
// pool.query(...);
];
try {
await Promise.all(insertQueries);
} catch(err) {
return callback('Couldn\'t insert API stats: ' + err);
}
return callback(null, 'API stats inserted successfully!');
AWS Java SDK выводит только сообщение об отладке, сообщающее, что время выполнения задачи истекло после 10.01секунд (serverless.yml имеет 10 секунд).