AWS Lambda - NODEJS中的功能

Nodejs是AWS Lambda函数支持的语言之一. nodejs支持的版本是v6.10和v8.10.在本章中,我们将详细了解NODEJS中AWS Lambda函数的各种功能.

NodeJS中的处理程序

在nodejs中编写WRS Lambda函数,我们应该首先声明一个处理程序. nodejs中的处理程序是文件的名称和导出函数的名称.例如,文件的名称是 index.js ,导出函数名称是 lambda处理程序,因此其对应的处理程序是 index.lambdahandler

观察此处显示的样本处理程序 :

exports.lambdahandler = function(event, context, callback) {   //code goes here}

Params to Handler

Handler是构建Lambda函数的主要核心.处理程序需要三个参数:事件,上下文回调.

事件参数

它具有触发事件的所有细节.例如,如果我们在S3上使用Lambda函数,则事件将包含S3对象的详细信息.

上下文参数

它具有上下文的详细信息,例如Lambda函数的属性和配置详细信息.

回调函数

它有助于将详细信息返回给呼叫者.回调的结构如下:<

callback(error, result);

下面给出了回调函数的参数和减号;

错误和减号; 如果在执行Lambda函数期间发生任何错误,这将包含详细信息.如果Lambda函数成功, null 可以作为回调函数的第一个参数传递.

结果&减去; 这将给出lambda函数成功执行的详细信息.如果发生错误,则忽略结果参数.

注意和减号; 在AWS Lambda中使用回调函数不是必需的.如果没有回调函数,则处理程序将其返回为null.

有效的回调签名在下面和下面给出;

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中都会记录错误或成功等回调详细信息控制台消息(如果有).

在Nodejs8.10中使用AWS Lambda

让我们了解如何在nodejs8.10中使用AWS Lambda和以同步和异步方式调用函数.

以同步方式调用Lambda函数

以下示例为您提供有关同步调用Lambda函数的建议方式和减号;

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控制台中测试此代码后,您可以观察到以下输出 :

偶数计数

请注意,上面代码的输出是一个promise对象.它没有给出计数,因为计数在setTimeout内递增,函数调用不等待setTimeout内的执行并返回promise对象.

如果我们有处理函数的async/await 将从lambda函数获得精确的输出.

以异步方式调用处理程序

以下示例为您提供了以异步方式调用Lambda函数的想法 :

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 时,执行暂停,直到函数内的promise得到解决.请注意, await 仅对 async 函数有效.

在AWS控制台中测试此代码后,您可以观察到以下输出.

偶数计数输出

NodeJS中的ContextDetails

Context对象提供详细信息,例如Lambda函数的名称,剩余时间(以毫秒为单位),请求ID,cloudwatch组名称,超时详细信息等.

下表显示上下文对象可用的方法和属性列表 :

上下文对象可用的方法

Sr.No方法名称&说明
1

getRemainingTimeInMillis()

此方法给出剩余时间(以毫秒为单位),直到Lambda函数终止函数

可用于上下文对象的属性

Sr.No属性名称&说明
1

functionName

这给出了AWS Lambda函数名称

2

functionVersion

这使AWS Lambda函数的版本执行

3

nvokedFunctionArn

这将提供ARN详细信息.

4

memoryLimitInMB

这显示添加的内存限制创建Lambda函数时

5

awsRequestId

这会提供AWS请求ID.

6

logGroupName

这将给出cloudwatch组名称的名称

7

logStreamName

Thi s将给出写日志的cloudwatch日志流名称.

8

identity

当与aws mobile一起使用时,这将提供有关亚马逊认知身份提供者的详细信息sdk.

给出的详细信息如下 :

  • identity.cognito_identity_id

  • identity.cognito_identity_pool_id

9

clientContext

这将与aws mobile sdk一起使用时提供客户端应用程序的详细信息.给出的详细信息如下 :

  • client_context.client.installation_id

  • client_context.client .app_title

  • client_context.client.app_version_name

  • client_context.client.app_version_code

  • client_context.client.app_package_name

  • client_context.custom  - 它具有来自移动客户端应用程序的自定义值的字典

  • client_context.env  - 它包含来自AWS Mobile SDK的环境详细信息

请看以下示例以更好地了解context object :

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观察以下截图 :

截图Cloud Watch

NodeJS中的错误处理

让我们了解错误通知的方式在NodeJS中完成.请注意以下代码 :

exports.handler = function(event, context, callback) {
   // This Source code only throws error. 
   var error = new Error("something is wrong");
   callback(error);   
};


执行结果详情

您可以在日志输出中观察以下内容 :

日志输出观察

错误详情在回调中给出如下 :

{
   "errorMessage": "something is wrong",
   "errorType": "Error",
   "stackTrace": [    "exports.handler (/var/task/index.js:2:17)"  ]
}