Node.js 中的 AWS Lambda 函数处理程序 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Node.js 中的 AWS Lambda 函数处理程序

Lambda 函数使用处理程序作为处理事件的方法。调用某个函数时,运行时将运行处理程序方法。处理程序退出或返回响应后,可处理另一个事件。

以下示例函数记录事件对象的内容并返回日志的位置。

例 index.js

exports.handler = async function(event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)) return context.logStreamName }

配置函数时,处理程序设置的值是文件的名称,也是导出的处理程序模块的名称(由点分隔)。控制台中的默认值为 index.handler,这也是本指南所用示例的值。它表示由 index.js 导出的 handler 模块。

运行时会将三个参数传递到处理程序方法。第一个参数是 event 对象,它包含来自调用方的信息。调用方在调用 Invoke 时将该信息作为 JSON 格式字符串传递,运行时将它转换为对象。当 AWS 服务调用您的函数时,事件结构因服务而异

第二个参数是 context 对象,它包含有关调用、函数和执行环境的信息。在前面的示例中,函数将从 context 对象获取日志流的名称,然后将其返回给调用方。

第三个参数 callback 是一个函数,您可以在非异步处理程序中调用它来发送响应。callback 函数有两个参数:一个是 Error,一个是响应。调用该函数时,Lambda 等待事件循环变为空,然后将响应或 error 返回给调用方。响应对象必须与 JSON.stringify 兼容。

对于异步处理程序,您将响应、error 或 promise 返回到运行时,而不是使用 callback

异步处理程序

对于异步处理程序,您可以分别使用 returnthrow 来发送响应和 error。函数必须使用 async 关键字来使用这两个方法返回响应或 error。

如果您的代码执行异步任务,须返回一个 promise 以确保该代码完成运行。该 promise 成功或被拒绝时,Lambda 会向调用方发送响应或 error。

例 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 SDK 请求

const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async function(event) { return s3.listBuckets().promise() }

非异步处理程序

以下示例函数检查 URL 并向调用方返回状态代码。

例 index.js 文件 – 包含 callback 的 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)) }) }

对于非异步处理程序,函数会一直执行,直到事件循环为空或函数超时。在完成所有事件循环任务之前,不会将响应发送给调用方。如果函数超时,则会返回 error。可以通过将 context.callbackWaitsForEmptyEventLoop 设置为 false,从而将运行时配置为立即发送响应。

在以下示例中,来自 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) }