Node.js 中的 AWS Lambda 函数处理程序
Lambda 函数处理程序是函数代码中处理事件的方法。当调用函数时,Lambda 运行处理程序方法。当该处理程序退出或返回一个响应时,它便可用于处理另一个事件。
以下示例函数记录事件对象的内容并返回日志的位置。
例 index.js
exports.handler = async function(event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)) return context.logStreamName }
配置函数时,处理程序设置的值是文件的名称,也是导出的处理程序方法的名称(由点分隔)。控制台中的默认值为 index.handler
,这也是本指南所用示例的值。这表示从 handler
文件中导出的 index.js
方法。
运行时会将三个参数传递到处理程序方法。第一个参数是 event
对象,它包含来自调用方的信息。调用程序在调用 Invoke 时将该信息作为 JSON 格式字符串传递,运行时将它转换为对象。当 AWS 服务调用您的函数时,事件结构因服务而异。
第二个参数是 context 对象,它包含有关调用、函数和执行环境的信息。在前面的示例中,函数将从 context 对象获取日志流的名称,然后将其返回给调用方。
第三个参数 callback
是一个函数,您可以在非异步处理程序中调用它来发送响应。callback 函数有两个参数:一个是 Error
,一个是响应。调用该函数时,Lambda 等待事件循环变为空,然后将响应或错误返回给调用方。响应对象必须与 JSON.stringify
兼容。
对于异步函数处理程序,您将响应、error 或 promise 返回到运行时,而不是使用 callback
。
如果您的函数有额外的依赖关系,使用 npm 将它们包含在您的部署包中。
异步处理程序
对于异步处理程序,您可以分别使用 return
和 throw
来发送响应和 error。函数必须使用 async
关键字来使用这两个方法返回响应或 error。
如果您的代码执行异步任务,须返回一个 promise 以确保该代码完成运行。当您完成或拒绝该 promise 时,Lambda 会向调用方发送响应或错误。
例 index.js 文件 – 包含异步处理程序和 promise 的 HTTP 请求
const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler =
async
function(event) { const promise = new Promise(function(resolve, reject) { https.get(url, (res) => { resolve(res.statusCode) }).on('error', (e) => { reject(Error(e)) }) }) return promise }
对于返回 promise 的库函数,可以直接将该 promise 返回到运行时。
例 index.js 文件 – 包含异步处理程序和 promise 的AWS开发工具包
const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async function(event) { return s3.listBuckets().promise() }
非异步处理程序
以下示例函数检查 URL 并向调用方返回状态代码。
例 index.js 文件 – 包含回调的 HTTP 请求
const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler = function(event, context, callback) { https.get(url, (res) => {
callback(null, res.statusCode)
}).on('error', (e) => {callback(Error(e))
}) }
对于非异步处理程序,函数会一直执行,直到事件循环
在以下示例中,来自 Amazon S3 的响应将在可用时立即返回给调用方。针对事件循环运行的超时被冻结,并在下次调用该函数时继续运行。
例 index.js 文件 – callbackWaitsForEmptyEventLoop
const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = function(event, context, callback) { context.callbackWaitsForEmptyEventLoop = false s3.listBuckets(null, callback) setTimeout(function () { console.log('Timeout complete.') }, 5000) }