2016-11-24 5 views
2

В моих локальных тестах mocha работает только одна функция обработчика. Однако, когда я загружаюсь в AWS (используя безсервисную инфраструктуру), время истекает (если вы не указали параметр uid, где он правильно отвечает сразу).AWS Lambda функция time out

Что особенно странно в том, что менее чем за 3 секунды (тайм-аут установлен на 5 секунд), задание завершается и даже выводится сообщение журнала «пост-факто», но оно каким-то образом вызывает обратный вызов и не завершает Лямбда-функция

Вот журнал cloudwatch:

![enter image description here] 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); 
    }); 

}; 

ответ

5

Добавьте следующее в первой строке вашей функции обработчика:

context.callbackWaitsForEmptyEventLoop = false 
+0

вау. это сработало. нужно немедленно взять кофе, но понятия не имеет, «почему» он работал. Я изучу его, но если вы свободны, можете ли вы объяснить, что привело вас к этому? – ken

+0

@ken, по существу, Node будет ждать пустой цикл событий до выхода из его процесса. Поэтому, если у вас есть js-файл, который просто выполняет функцию '(function recurse() {setInterval (recurse, 1)})()', то запустите это с узлом, процесс никогда не выйдет, пока вы не убьете его вручную. Обратный вызов Lambda обеспечивает соблюдение этого, если вы не добавите строку из моего ответа. В этом случае Lambda по существу просто вызовет 'process.exit()' после вызова обратного вызова. – idbehold

+3

@ken это также означает, что что-то из вашего кода заставляет цикл событий никогда не стекать. Связи DB являются типичной причиной этого, так как они откроют сокет, и узел не будет считать пул событий пустым, пока сокет все еще открыт. – idbehold

0

Я предполагаю, что вы используете лямбда с «Node.js Время воспроизведения 0,10»

Таким образом, вы должны добавить

context.done(null, 'Terminate Lambda'); 

прекратить выполнение.

В лямбда документе AWS, он упоминает, что:

Обратный вызов поддерживается только во время выполнения v4.3 Node.js. Если вы используете с использованием более ранней версии v0.10.42, вам необходимо использовать методы (сделано, успешно и неудачно) для правильного завершения функции Lambda .

Пожалуйста, обратитесь эту link для указанной выше информации

+0

Я использую v4.3 runtime – ken

Смежные вопросы