Nodejs — это один из языков, которые поддерживает лямбда-функция AWS. Версия, поддерживаемая с помощью nodejs: v6.10 и v8.10. В этой главе мы подробно узнаем о различных функциях лямбда-функции AWS в NODEJS.
Обработчик в NodeJS
Чтобы написать AWS лямбда-функцию в nodejs, мы должны сначала объявить обработчик. Обработчик в nodejs — это имя файла и имя функции экспорта. Например, имя файла — index.js, а имя функции экспорта — лямбда-обработчик , поэтому соответствующий ему обработчик — index.lambdahandler.
Обратите внимание на пример обработчика, показанный здесь —
exports.lambdahandler = function(event, context, callback) { //code goes here}
Params to Handler
Обработчик является основным ядром для построения лямбда-функции. Обработчик принимает три параметра: событие, контекст и обратный вызов .
Параметр события
В нем есть все подробности сработавшего события. Например, если мы используем лямбда-функцию для запуска на S3, событие будет иметь подробную информацию об объекте S3.
Параметр контекста
Он содержит детали контекста, такие как свойства и детали конфигурации функции Lambda.
Функция обратного вызова
Это помогает в предоставлении деталей обратно звонящему. Структура обратного вызова выглядит следующим образом —
callback(error, result);
Параметры функции обратного вызова описаны ниже:
Ошибка — это будет иметь подробную информацию, если какая-либо ошибка произошла во время выполнения лямбда-функции. Если лямбда-функция завершается успешно, в качестве первого параметра функции обратного вызова можно передать значение null .
Результат — это даст подробную информацию об успешном выполнении лямбда-функции. Если возникает ошибка, результат param игнорируется.
Примечание. В AWS Lambda не обязательно использовать функцию обратного вызова. Incase, если нет функции обратного вызова, обработчик вернет ее как ноль.
Действительные подписи обратного вызова приведены ниже —
callback(); // It will return success, but no indication to the caller callback(null); // It will return success, but no indication to the caller callback(null, "success"); // It will return the success indication to the caller callback(error); // It will return the error indication to the caller
Всякий раз, когда выполняется AWS Lambda, детали обратного вызова, такие как ошибка или успех, регистрируются в AWS CloudWatch вместе с консольными сообщениями, если таковые имеются.
Работа с AWS Lambda в Nodejs8.10
Давайте разберемся, как работать с AWS Lambda в nodejs8.10, и вызвать функцию синхронно и асинхронно.
Вызов лямбда-функции в режиме синхронизации
Следующий пример дает вам представление о том, как вызывать лямбда-функцию синхронно.
exports.handler = function(event, context, callback) { let arrItems = [4,5,6,8,9,10,35,70,80,31]; function countevennumbers (items) { return new Promise(resolve => { setTimeout(() => { let a = 0; for (var i in items) { if (items[i] % 2 == 0) { a++; } } resolve(a); },2000); }); } let evennumber = countevennumbers(arrItems); callback(null,'even numbers equals ='+evennumber); };
После тестирования этого кода в консоли AWS вы можете наблюдать следующий вывод:
Обратите внимание, что вывод из приведенного выше кода является объектом обещания. Он не дает счетчик, поскольку счетчик увеличивается внутри setTimeout, а вызов функции не ожидает выполнения внутри setTimeout и возвращает объект обещания.
Если бы у нас была функция async / await в функции-обработчике, мы получим точный результат от лямбда-функции
Вызов обработчика в асинхронном режиме
Следующий пример дает вам представление о том, как вызывать лямбда-функцию асинхронным способом.
exports.handler = async function(event, context, callback) { let arrItems = [4,5,6,8,9,10,35,70,80,31]; function countevennumbers (items) { return new Promise(resolve => { setTimeout(() => { let a = 0; for (var i in items) { if (items[i] % 2 == 0) { a++; } } resolve(a); }, 2000); }); } let evennumber = await countevennumbers(arrItems); callback(null,'even numbers equals ='+evennumber); };
Мы добавили async и ожидаем в приведенном выше коде. Когда мы используем await рядом с вызовом функции, выполнение приостанавливается, пока не будет выполнено обещание внутри функции. Обратите внимание, что ожидание действительно только для асинхронных функций.
После тестирования этого кода в консоли AWS вы можете наблюдать следующий вывод:
ContextDetails в NodeJS
Объект контекста предоставляет такие детали, как имя лямбда-функции, оставшееся время в миллисекундах, идентификатор запроса, имя группы в облачном хранилище, сведения о тайм-ауте и т. Д.
В следующих таблицах показан список методов и атрибутов, доступных с контекстным объектом —
Метод доступен для объекта контекста
Sr.No | Название и описание метода |
---|---|
1 |
getRemainingTimeInMillis () Этот метод дает оставшееся время в миллисекундах, пока функция Lambda не завершит функцию. |
getRemainingTimeInMillis ()
Этот метод дает оставшееся время в миллисекундах, пока функция Lambda не завершит функцию.
Атрибуты, доступные для объекта контекста
Sr.No | Название атрибута и описание |
---|---|
1 |
FunctionName Это дает имя лямбда-функции AWS |
2 |
functionVersion Это дает версию AWS Lambda, выполняющую функцию |
3 |
nvokedFunctionArn Это даст ARN детали. |
4 |
memoryLimitInMB Это показывает ограничение памяти, добавленное при создании лямбда-функции |
5 |
awsRequestId Это дает идентификатор запроса AWS. |
6 |
logGroupName Это даст название имени группы CloudWatch |
7 |
logStreamName Это даст имя имени потока журнала cloudwatch, в котором записываются журналы. |
8 |
идентичность Это даст подробную информацию о Amazon Cognito провайдера идентификации при использовании с AWS Mobile SDK. Подробности приведены ниже:
|
9 |
clientContext Это будет подробная информация о клиентском приложении при использовании с AWS Mobile SDK. Детали приведены ниже:
|
FunctionName
Это дает имя лямбда-функции AWS
functionVersion
Это дает версию AWS Lambda, выполняющую функцию
nvokedFunctionArn
Это даст ARN детали.
memoryLimitInMB
Это показывает ограничение памяти, добавленное при создании лямбда-функции
awsRequestId
Это дает идентификатор запроса AWS.
logGroupName
Это даст название имени группы CloudWatch
logStreamName
Это даст имя имени потока журнала cloudwatch, в котором записываются журналы.
идентичность
Это даст подробную информацию о Amazon Cognito провайдера идентификации при использовании с AWS Mobile SDK.
Подробности приведены ниже:
clientContext
Это будет подробная информация о клиентском приложении при использовании с AWS Mobile SDK. Детали приведены ниже:
Посмотрите на следующий пример, чтобы получить лучшее представление об объекте контекста —
exports.handler = (event, context, callback) => { // TODO implement console.log('Remaining time =>', context.getRemainingTimeInMillis()); console.log('functionName =>', context.functionName); console.log('AWSrequestID =>', context.awsRequestId); console.log('logGroupName =>', context.log_group_name); console.log('logStreamName =>', context.log_stream_name); console.log('clientContext =>', context.clientContext); callback(null, 'Name of aws Lambda is=>'+context.functionName); };
После тестирования этого кода в консоли AWS вы можете наблюдать следующий вывод:
После тестирования этого кода в консоли AWS вы можете наблюдать следующий вывод журнала:
Вход в NodeJS
Мы можем использовать console.log для входа в NodeJS. Детали журнала можно получить из сервиса CloudWatch для функции Lambda.
Обратите внимание на следующий пример для лучшего понимания —
exports.handler = (event, context, callback) => { // TODO implement console.log('Logging for AWS Lamnda in NodeJS'); callback(null, 'Name of aws Lambda is=>'+context.functionName); };
После тестирования этого кода в консоли AWS вы можете наблюдать следующий вывод:
Вы можете увидеть следующий скриншот из CloudWatch —
Обработка ошибок в NodeJS
Давайте разберемся, как делается уведомление об ошибке в NodeJS. Соблюдайте следующий код —
exports.handler = function(event, context, callback) { // This Source code only throws error. var error = new Error("something is wrong"); callback(error); };
Вы можете наблюдать следующее в выводе журнала:
Детали ошибки приведены в обратном вызове следующим образом: