AWS Lambda – NODEJS 中的函数

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

NodeJS 中的处理程序

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

观察此处显示的示例处理程序 −

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

Handler 的参数

Handler 是构建 Lambda 函数的主要核心。处理程序需要三个参数:event、contextcallback

事件参数

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

上下文参数

它包含上下文的详细信息,例如 Lambda 函数的属性和配置详细信息。

回调函数

它有助于将详细信息返回给调用者。回调的结构如下所示 −

callback(error, result);

回调函数的参数解释如下 −

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

结果 − 这将提供 lambda 函数成功执行的详细信息。如果发生错误,则忽略结果参数。

注意 − 在 AWS Lambda 中,不强制使用回调函数。如果没有回调函数,处理程序将返回 null。

有效的回调签名如下 −

callback(); 		// 它将返回成功,但不向调用者提供任何指示
callback(null); 	// 它将返回成功,但不向调用者提供任何指示
callback(null, "success"); // 它将向调用者返回成功指示
callback(error); 	// 它将向调用者返回错误指示

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

Even Number Count

请注意,上述代码的输出是一个承诺对象。它不提供计数,因为计数在 setTimeout 内递增,并且函数调用不会等待 setTimeout 内的执行并返回承诺对象。

如果我们在处理程序函数上使用 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);
};

我们在上面的代码中添加了 asyncawait。当我们在函数调用旁边使用 await 时,执行会暂停,直到函数内部的 promise 得到解决。请注意,await 仅对 async 函数有效。

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

偶数计数输出

NodeJS 中的 ContextDetails

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

下表显示了 context 对象可用的方法和属性列表 −

context 对象可用的方法

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

这将给出日志所在的 cloudwatch 日志流名称的名称写。

8

identity

这将提供有关与 aws mobile sdk 一起使用时 amazon cognito 身份提供商的详细信息。

给出的详细信息如下 −

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

Succeeded Logs

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

Log Output Testing

在 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) {
   // 此源代码仅抛出错误。
   var error = new Error("something is wrong");
   callback(error);   
};
执行结果详情

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

日志输出观察

回调中给出了错误详细信息,如下所示 −

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