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 callercallback(null); // It will return success, but no indication to the callercallback(null, "success"); // It will return the success indication to the callercallback(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. 给出的详细信息如下 :
|
9 | clientContext 这将与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观察以下截图 :
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)" ]}