Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
Node.js 中的 Amazon Lambda 函数处理程序
Lambda 函数处理程序是函数代码中处理事件的方法。当调用函数时,Lambda 运行处理程序方法。当该处理程序退出或返回一个响应时,它便可用于处理另一个事件。
以下示例函数记录事件对象的内容并返回日志的位置。
- CommonJS module handler
-
exports.handler = async function (event, context) {
console.log("EVENT: \n" + JSON.stringify(event, null, 2));
return context.logStreamName;
};
- ES module handler
-
export const handler = async (event, context) => {
console.log("EVENT: \n" + JSON.stringify(event, null, 2));
return context.logStreamName;
};
配置函数时,处理程序设置的值是文件的名称,也是导出的处理程序方法的名称(由点分隔)。控制台中的默认值为 index.handler
,这也是本指南所用示例的值。这表示从 handler
文件中导出的 index.js
方法。
运行时会将参数传递到处理程序方法。第一个参数是 event
对象,它包含来自调用方的信息。调用程序在调用 Invoke 时将该信息作为 JSON 格式字符串传递,运行时将它转换为对象。当 Amazon 服务调用您的函数时,事件结构因服务而异。
第二个参数是 context 对象,它包含有关调用、函数和执行环境的信息。在前面的示例中,函数将从 context 对象获取日志流的名称,然后将其返回给调用方。
您也可以使用回调参数,这是一种可在非异步处理程序中进行调用以发送响应的函数。我们建议您使用 Async/await(异步/等待),而不使用 Callback(回调)。Async/await 具有更好的易读性、错误处理能力和效率。有关 Async/await 与 Callback 之间差异的更多信息,请参阅 使用回调。
使用异步/等待
如果您的代码执行异步任务,则使用 Async/await 模式来确保处理程序会完成运行。Async/await 是一种简洁、易读的 Node.js 异步代码编写方式,无需嵌套回调或链式承诺。使用 Async/await 时,您编写的代码看起来与同步代码类似,同时仍然是异步和非阻止式的。
async
关键字会将函数标记为异步,await
关键字会暂停函数的执行,直到 Promise
完成解析为止。
- CommonJS module handler
-
例 – 包含 Async/await 的 HTTP 请求
const https = require("https");
let url = "https://aws.amazon.com/";
exports.handler = async function (event) {
let statusCode;
await new Promise(function (resolve, reject) {
https.get(url, (res) => {
statusCode = res.statusCode;
resolve(statusCode);
}).on("error", (e) => {
reject(Error(e));
});
});
console.log(statusCode);
return statusCode;
};
- ES module handler
-
例 – 包含 Async/await 的 HTTP 请求
此示例使用 fetch
,它支持 nodejs18.x
运行时。
const url = "https://aws.amazon.com/";
export const handler = async(event) => {
try {
// fetch is available with Node.js 18
const res = await fetch(url);
console.info("status", res.status);
return res.status;
}
catch (e) {
console.error(e);
return 500;
}
};
下一个示例使用 Async/await 来列出您的 Amazon Simple Storage Service 存储桶。
在使用此示例之前,请确保您的函数的执行角色具有 Amazon S3 读取权限。
- CommonJS module handler
-
例 – 使用 Async/await 的 Amazon SDK v2
此示例使用 Amazon SDK for JavaScript v2,它支持 Node.js 12、14 和 16 运行时。
const AWS = require('aws-sdk')
const s3 = new AWS.S3()
exports.handler = async function(event) {
const buckets = await s3.listBuckets().promise()
return buckets
}
- ES module handler
-
例 – 使用 Async/await 的 Amazon SDK v3
此示例使用 Amazon SDK for JavaScript v3,它支持 nodejs18.x
运行时。
import {S3Client, ListBucketsCommand} from '@aws-sdk/client-s3';
const s3 = new S3Client({region: 'us-east-1'});
export const handler = async(event) => {
const data = await s3.send(new ListBucketsCommand({}));
return data.Buckets;
};
使用回调
我们建议您使用 Async/await 来声明函数处理程序,而不是使用回调。Async/await 是更好的选择,原因有以下几点:
-
易读性:Async/await 代码比回调代码更易阅读和理解,回调代码很快就会变得难以理解,从而导致回调失败。
-
调试和错误处理:基于回调的代码可能非常难以调试。调用堆栈可能变得难以理解,并且很容易出现错误。使用 Async/await 时,您可以使用 try/catch 块来处理错误。
-
效率:回调通常需要在代码的不同部分之间切换。Async/await 可以减少上下文切换的数量,从而提高代码效率。
当您在处理程序中使用回调时,函数会一直执行,直到 事件循环 为空或函数超时为止。在完成所有事件循环任务之前,不会将响应发送给调用方。如果函数超时,则会返回 error。可以通过将 context.callbackWaitsForEmptyEventLoop 设置为 false,从而将运行时配置为立即发送响应。
callback 函数有两个参数:一个是 Error
,一个是响应。响应对象必须与 JSON.stringify
兼容。
以下示例函数检查 URL 并向调用方返回状态代码。
- CommonJS module handler
-
例 – 包含回调的 HTTP 请求
const https = require("https");
let url = "https://aws.amazon.com/";
exports.handler = function (event, context, callback) {
https.get(url, (res) => {
callback(null, res.statusCode)
;
}).on("error", (e) => {
callback(Error(e))
;
});
};
- ES module handler
-
例 – 包含回调的 HTTP 请求
import https from "https";
let url = "https://aws.amazon.com/";
export function handler(event, context, callback) {
https.get(url, (res) => {
callback(null, res.statusCode)
;
}).on("error", (e) => {
callback(Error(e))
;
});
}
在下一示例中,来自 Amazon S3 的响应将在可用时立即返回给调用方。针对事件循环运行的超时被冻结,并在下次调用该函数时继续运行。
在使用此示例之前,请确保您的函数的执行角色具有 Amazon S3 读取权限。
- CommonJS module handler
-
例 – 包含 callbackWaitsForEmptyEventLoop 的 Amazon SDK v2
此示例使用 Amazon SDK for JavaScript v2,它支持 Node.js 12、14 和 16 运行时。
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);
};
- ES module handler
-
例 – 包含 callbackWaitsForEmptyEventLoop 的 Amazon SDK v3
此示例使用 Amazon SDK for JavaScript v3,它支持 nodejs18.x
运行时。
import AWS from "@aws-sdk/client-s3";
const s3 = new AWS.S3({});
export const handler = function (event, context, callback) {
context.callbackWaitsForEmptyEventLoop
= false
;
s3.listBuckets({}, callback);
setTimeout(function () {
console.log("Timeout complete.");
}, 5000);
};