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 服务调用您的函数时,事件结构因服务而异

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

第三个参数 callback 是一个函数,您可以在非异步函数中调用以发送响应。回调函数采用两个参数:一个 Error 和一个响应。响应对象必须与 JSON.stringify 兼容。

对于异步函数,您将返回一个响应、错误或对运行时的承诺而不是使用 callback

异步函数

对于异步函数,您可以分别使用 returnthrow 来发送响应或错误。函数必须使用 async 关键字来使用这些方法返回响应或错误。

如果您的代码执行了一个异步任务,请返回一个承诺以确保该代码完成运行。当您完成或拒绝该承诺时,Lambda 会向调用方发送响应或错误。

例 index.js 文件 – 包含异步函数和承诺的 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 }

对于返回了一个承诺的库,您可以直接将该承诺返回到运行时。

例 index.js 文件 – 包含异步函数和承诺的 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)) }) }

对于非异步函数,函数执行将继续,直到事件循环为空或函数超时。在完成所有事件循环任务之前,不会将响应发送给调用程序。如果函数超时,则会返回错误。您可以通过将 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) }

本页内容: