В моих локальных тестах mocha работает только одна функция обработчика. Однако, когда я загружаюсь в AWS (используя безсервисную инфраструктуру), время истекает (если вы не указали параметр uid
, где он правильно отвечает сразу).AWS Lambda функция time out
Что особенно странно в том, что менее чем за 3 секунды (тайм-аут установлен на 5 секунд), задание завершается и даже выводится сообщение журнала «пост-факто», но оно каким-то образом вызывает обратный вызов и не завершает Лямбда-функция
Вот журнал cloudwatch:
] 1
А вот обработчик функции:
export const handler = (event: IRequestInput, context: IContext, cb: IGatewayCallback) => {
console.log('EVENT:\n', JSON.stringify(event, null, 2));
const uid = _.get(event, 'queryStringParameters.uid', undefined);
if(!uid) {
cb(null, {
statusCode: 412,
body: 'no User ID was provided by frontend'
});
return;
}
oauth.getRequestToken()
.then(token => {
console.log('Token is:\n', JSON.stringify(token, null, 2));
console.log('User ID: ', uid);
token.uid = uid;
return Promise.resolve(token);
})
.then((token) => {
console.log('URL: ', token.url);
cb(null, {
statusCode: 200,
body: token.url
});
console.log('post-facto');
})
.catch((err: PromiseError) => {
console.log('Problem in getting promise token: ', err);
cb(err.message);
});
};
вау. это сработало. нужно немедленно взять кофе, но понятия не имеет, «почему» он работал. Я изучу его, но если вы свободны, можете ли вы объяснить, что привело вас к этому? – ken
@ken, по существу, Node будет ждать пустой цикл событий до выхода из его процесса. Поэтому, если у вас есть js-файл, который просто выполняет функцию '(function recurse() {setInterval (recurse, 1)})()', то запустите это с узлом, процесс никогда не выйдет, пока вы не убьете его вручную. Обратный вызов Lambda обеспечивает соблюдение этого, если вы не добавите строку из моего ответа. В этом случае Lambda по существу просто вызовет 'process.exit()' после вызова обратного вызова. – idbehold
@ken это также означает, что что-то из вашего кода заставляет цикл событий никогда не стекать. Связи DB являются типичной причиной этого, так как они откроют сокет, и узел не будет считать пул событий пустым, пока сокет все еще открыт. – idbehold