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、context 和 callback。
事件参数
它包含触发事件的所有详细信息。例如,如果我们使用 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 控制台中测试此代码后,您可以观察到以下输出 −

请注意,上述代码的输出是一个承诺对象。它不提供计数,因为计数在 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); };
我们在上面的代码中添加了 async 和 await。当我们在函数调用旁边使用 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 身份提供商的详细信息。 给出的详细信息如下 −
|
9 | 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) { // 此源代码仅抛出错误。 var error = new Error("something is wrong"); callback(error); };

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

回调中给出了错误详细信息,如下所示 −
{ "errorMessage": "something is wrong", "errorType": "Error", "stackTrace": [ "exports.handler (/var/task/index.js:2:17)" ] }