

 [适用于 JavaScript 的 AWS SDK V3 API 参考指南](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/)详细描述了 适用于 JavaScript 的 AWS SDK 版本 3 (V3) 的所有 API 操作。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# JavaScript 代码示例的 SDK
<a name="sdk-code-samples"></a>

本节中的主题包含如何与各种服务 适用于 JavaScript 的 AWS SDK 一起使用来执行常见任务 APIs 的示例。

在上的 “代码示例[存储库” 中查找这些示例和其他示例的源AWS 代码 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples)。要提出一个新的代码示例供 AWS 文档团队考虑制作，请创建请求。该团队正在寻求生成涵盖更多应用场景和使用情形的代码示例，而不仅仅是涵盖个别 API 调用的简单代码片段。有关说明，请参阅的[贡献指南中的 “*创作代码*” 部分。 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/CONTRIBUTING.md)

**重要**  
这些示例使用 ECMAScript6 导入/导出语法。  
这需要使用 Node.js 版本 14.17 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)以获取转换指南。

**Topics**
+ [

# JavaScript ES6/CommonJS 语法
](sdk-example-javascript-syntax.md)
+ [

# AWS Elemental MediaConvert 示例
](emc-examples.md)
+ [

# AWS Lambda 示例
](lambda-examples.md)
+ [

# Amazon Lex 示例
](lex-examples.md)
+ [

# Amazon Polly 示例
](polly-examples.md)
+ [

# Amazon Redshift 示例
](redshift-examples.md)
+ [

# Amazon Simple Email Service 示例
](ses-examples.md)
+ [

# Amazon Simple Notification Service 示例
](sns-examples.md)
+ [

# Amazon Transcribe 示例
](Transcribe-examples.md)
+ [

# 在 Amazon EC2 实例上设置 Node.js
](setting-up-node-on-ec2-instance.md)
+ [

# 使用 API Gateway 调用 Lambda
](api-gateway-invoking-lambda-example.md)
+ [

# 创建计划事件以执行 AWS Lambda 函数
](scheduled-events-invoking-lambda-example.md)
+ [

# 构建 Amazon Lex 聊天机器人
](lex-bot-example.md)

# JavaScript ES6/CommonJS 语法
<a name="sdk-example-javascript-syntax"></a>

适用于 JavaScript 的 AWS SDK 代码示例是使用 ECMAScript 6 (ES6) 编写的。ES6 带来了新的语法和新功能，使您的代码更现代、更具可读性，并能做到更多的事情。

要使用 ES6，您需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。但是，如果您愿意，可以使用以下指南将我们的任何示例转换为 CommonJS 语法：
+ 从您的项目环境中的 `package.json` 中移除 `"type" : "module"`。
+ 将所有 ES6 `import` 语句转换为 CommonJS `require` 语句。例如，将以下内容：

  ```
  import { CreateBucketCommand } from "@aws-sdk/client-s3";
  import { s3 } from "./libs/s3Client.js";
  ```

  转换为其 CommonJS 等效语句：

  ```
  const { CreateBucketCommand } = require("@aws-sdk/client-s3");
  const { s3 } = require("./libs/s3Client.js");
  ```
+ 将所有 ES6 `export` 语句转换为 CommonJS `module.exports` 语句。例如，将以下内容：

  ```
  export {s3}
  ```

  转换为其 CommonJS 等效语句：

  ```
  module.exports = {s3}
  ```

以下示例演示了用于在 ES6 和 CommonJS 中创建 Amazon S3 存储桶的代码示例。

------
#### [ ES6 ]

libs/s3Client.js

```
// Create service client module using ES6 syntax.
import { S3Client } from "@aws-sdk/client-s3";
// Set the AWS region
const REGION = "eu-west-1"; //e.g. "us-east-1"
// Create Amazon S3 service object.
const s3 = new S3Client({ region: REGION });
// Export 's3' constant.
export {s3};
```

s3\$1createbucket.js

```
// Get service clients module and commands using ES6 syntax.
 import { CreateBucketCommand } from "@aws-sdk/client-s3";
 import { s3 } from "./libs/s3Client.js";

// Get service clients module and commands using CommonJS syntax.
// const { CreateBucketCommand } = require("@aws-sdk/client-s3");
// const { s3 } = require("./libs/s3Client.js");

// Set the bucket parameters
const bucketParams = { Bucket: "BUCKET_NAME" };

// Create the Amazon S3 bucket.
const run = async () => {
  try {
    const data = await s3.send(new CreateBucketCommand(bucketParams));
    console.log("Success", data.Location);
    return data;
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

------
#### [ CommonJS ]

libs/s3Client.js

```
// Create service client module using CommonJS syntax.
 const { S3Client } = require("@aws-sdk/client-s3");
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
 // Create Amazon S3 service object.
const s3 = new S3Client({ region: REGION });
// Export 's3' constant.
 module.exports ={s3};
```

s3\$1createbucket.js

```
// Get service clients module and commands using CommonJS syntax.
const { CreateBucketCommand } = require("@aws-sdk/client-s3");
const { s3 } = require("./libs/s3Client.js");

// Set the bucket parameters
const bucketParams = { Bucket: "BUCKET_NAME" };

// Create the Amazon S3 bucket.
const run = async () => {
  try {
    const data = await s3.send(new CreateBucketCommand(bucketParams));
    console.log("Success", data.Location);
    return data;
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

------

# AWS Elemental MediaConvert 示例
<a name="emc-examples"></a>

AWS Elemental MediaConvert 是基于文件的视频转码服务与广播级的功能。您可以使用它来创建资产广播并为视频点播 (VOD) 交付整个 Internet。有关更多信息，请参阅 [AWS Elemental MediaConvert 用户指南](https://docs.aws.amazon.com/mediaconvert/latest/ug/)。**

适用于 MediaConvert 的 JavaScript API 通过 `MediaConvert` 客户端类公开。有关更多信息，请参阅《API 参考》中的[类：MediaConvert](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/)。

**Topics**
+ [

# 在 MediaConvert 中创建和管理转码作业
](emc-examples-jobs.md)
+ [

# 在 MediaConvert 中使用作业模板
](emc-examples-templates.md)

# 在 MediaConvert 中创建和管理转码作业
<a name="emc-examples-jobs"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 如何在 MediaConvert 中创建转码作业。
+ 如何取消转码作业。
+ 如何检索已完成转码作业的 JSON。
+ 如何检索最多 20 个最新创建的作业的 JSON 数组。

## 情景
<a name="emc-examples-jobs-scenario"></a>

在此示例中，您使用 Node.js 模块调用 MediaConvert 来创建和管理转码作业。该代码使用 SDK for JavaScript，通过 MediaConvert 客户端类的以下方法来完成此操作：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/CreateJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/CreateJobCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/CancelJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/CancelJobCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/GetJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/GetJobCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/ListJobsCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/ListJobsCommand/)

## 完成先决条件任务
<a name="emc-examples-jobs-prerequisites"></a>

要设置和运行此示例，请先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的 适用于 JavaScript 的 AWS SDK 和第三方模块。请按照 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/mediaconvert/README.md) 上的说明进行操作。
+ 使用用户凭证创建共享配置文件。有关提供共享凭证文件的更多信息，请参阅《AWS SDK 和工具参考指南》**中的[共享配置和凭证文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。
+ 创建和配置 Amazon S3 存储桶，提供作业输入文件和输出文件的存储。有关详细信息，请参阅《AWS Elemental MediaConvert 用户指南》**中的[创建用于文件的存储](https://docs.aws.amazon.com/mediaconvert/latest/ug/set-up-file-locations.html)。
+ 将输入视频上传到您为输入存储预置的 Amazon S3 存储桶。有关支持的输入视频编解码器和容器的列表，请参阅《AWS Elemental MediaConvert 用户指南》**中的[支持的输入编解码器和容器](https://docs.aws.amazon.com/mediaconvert/latest/ug/reference-codecs-containers-input.html)。
+ 创建一个 IAM 角色，该角色使 MediaConvert 能够访问输入文件以及存储输出文件的 Amazon S3 存储桶。有关更多信息，请参阅《AWS Elemental MediaConvert 用户指南》**中的[设置 IAM 权限](https://docs.aws.amazon.com/mediaconvert/latest/ug/iam-role.html)。

**重要**  
此示例使用 ECMAScript6 (ES6)。这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。  
但是，如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 定义简单的转码作业
<a name="emc-examples-jobs-spec"></a>

创建文件名为 `emc_createjob.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。创建定义转码任务参数的 JSON。

这些参数有非常详细的说明。您可以使用 [AWS Elemental MediaConvert 控制台](https://console.aws.amazon.com/mediaconvert/)生成 JSON 作业参数，方法是在控制台中选择您的作业设置，然后选择**作业**部分底部的**显示作业 JSON**。本示例说明了简单作业的 JSON。

**注意**  
将 *JOB\$1QUEUE\$1ARN* 替换为 MediaConvert 作业队列，将 *IAM\$1ROLE\$1ARN* 替换为 IAM 角色的 Amazon 资源名称（ARN），将 *OUTPUT\$1BUCKET\$1NAME* 替换为目标存储桶名称（例如“s3://OUTPUT\$1BUCKET\$1NAME/”），将 *INPUT\$1BUCKET\$1AND\$1FILENAME* 替换为输入存储桶和文件名，例如“s3://INPUT\$1BUCKET/FILE\$1NAME”。

```
const params = {
  Queue: "JOB_QUEUE_ARN", //JOB_QUEUE_ARN
  UserMetadata: {
    Customer: "Amazon",
  },
  Role: "IAM_ROLE_ARN", //IAM_ROLE_ARN
  Settings: {
    OutputGroups: [
      {
        Name: "File Group",
        OutputGroupSettings: {
          Type: "FILE_GROUP_SETTINGS",
          FileGroupSettings: {
            Destination: "OUTPUT_BUCKET_NAME", //OUTPUT_BUCKET_NAME, e.g., "s3://BUCKET_NAME/"
          },
        },
        Outputs: [
          {
            VideoDescription: {
              ScalingBehavior: "DEFAULT",
              TimecodeInsertion: "DISABLED",
              AntiAlias: "ENABLED",
              Sharpness: 50,
              CodecSettings: {
                Codec: "H_264",
                H264Settings: {
                  InterlaceMode: "PROGRESSIVE",
                  NumberReferenceFrames: 3,
                  Syntax: "DEFAULT",
                  Softness: 0,
                  GopClosedCadence: 1,
                  GopSize: 90,
                  Slices: 1,
                  GopBReference: "DISABLED",
                  SlowPal: "DISABLED",
                  SpatialAdaptiveQuantization: "ENABLED",
                  TemporalAdaptiveQuantization: "ENABLED",
                  FlickerAdaptiveQuantization: "DISABLED",
                  EntropyEncoding: "CABAC",
                  Bitrate: 5000000,
                  FramerateControl: "SPECIFIED",
                  RateControlMode: "CBR",
                  CodecProfile: "MAIN",
                  Telecine: "NONE",
                  MinIInterval: 0,
                  AdaptiveQuantization: "HIGH",
                  CodecLevel: "AUTO",
                  FieldEncoding: "PAFF",
                  SceneChangeDetect: "ENABLED",
                  QualityTuningLevel: "SINGLE_PASS",
                  FramerateConversionAlgorithm: "DUPLICATE_DROP",
                  UnregisteredSeiTimecode: "DISABLED",
                  GopSizeUnits: "FRAMES",
                  ParControl: "SPECIFIED",
                  NumberBFramesBetweenReferenceFrames: 2,
                  RepeatPps: "DISABLED",
                  FramerateNumerator: 30,
                  FramerateDenominator: 1,
                  ParNumerator: 1,
                  ParDenominator: 1,
                },
              },
              AfdSignaling: "NONE",
              DropFrameTimecode: "ENABLED",
              RespondToAfd: "NONE",
              ColorMetadata: "INSERT",
            },
            AudioDescriptions: [
              {
                AudioTypeControl: "FOLLOW_INPUT",
                CodecSettings: {
                  Codec: "AAC",
                  AacSettings: {
                    AudioDescriptionBroadcasterMix: "NORMAL",
                    RateControlMode: "CBR",
                    CodecProfile: "LC",
                    CodingMode: "CODING_MODE_2_0",
                    RawFormat: "NONE",
                    SampleRate: 48000,
                    Specification: "MPEG4",
                    Bitrate: 64000,
                  },
                },
                LanguageCodeControl: "FOLLOW_INPUT",
                AudioSourceName: "Audio Selector 1",
              },
            ],
            ContainerSettings: {
              Container: "MP4",
              Mp4Settings: {
                CslgAtom: "INCLUDE",
                FreeSpaceBox: "EXCLUDE",
                MoovPlacement: "PROGRESSIVE_DOWNLOAD",
              },
            },
            NameModifier: "_1",
          },
        ],
      },
    ],
    AdAvailOffset: 0,
    Inputs: [
      {
        AudioSelectors: {
          "Audio Selector 1": {
            Offset: 0,
            DefaultSelection: "NOT_DEFAULT",
            ProgramSelection: 1,
            SelectorType: "TRACK",
            Tracks: [1],
          },
        },
        VideoSelector: {
          ColorSpace: "FOLLOW",
        },
        FilterEnable: "AUTO",
        PsiControl: "USE_PSI",
        FilterStrength: 0,
        DeblockFilter: "DISABLED",
        DenoiseFilter: "DISABLED",
        TimecodeSource: "EMBEDDED",
        FileInput: "INPUT_BUCKET_AND_FILENAME", //INPUT_BUCKET_AND_FILENAME, e.g., "s3://BUCKET_NAME/FILE_NAME"
      },
    ],
    TimecodeConfig: {
      Source: "EMBEDDED",
    },
  },
};
```

## 创建转码作业
<a name="emc-examples-jobs-create"></a>

在创建作业参数 JSON 后，调用异步 `run` 方法以调用 `MediaConvert` 客户端服务对象并传递参数。所创建作业的 ID 在响应 `data` 中返回。

```
const run = async () => {
  try {
    const data = await emcClient.send(new CreateJobCommand(params));
    console.log("Job created!", data);
    return data;
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node emc_createjob.js 
```

此完整示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/mediaconvert/src/emc_createjob.js)找到。

## 取消转码作业
<a name="emc-examples-jobs-cancel"></a>

创建文件名为 `emc_canceljob.js` 的 Node.js 模块。请务必如前所示配置 SDK，包括下载所需的客户端和软件包。创建包含要取消的作业的 ID 的 JSON。然后，通过创建一个 promise 来调用 `MediaConvert` 客户端服务对象并传递参数，以此调用 `CancelJobCommand` 方法。承诺处理响应中的回调。

**注意**  
将 *JOB\$1ID* 替换为要取消的作业的 ID。

```
// Import required AWS-SDK clients and commands for Node.js
import { CancelJobCommand } from "@aws-sdk/client-mediaconvert";
import { emcClient } from "./libs/emcClient.js";

// Set the parameters
const params = { Id: "JOB_ID" }; //JOB_ID

const run = async () => {
  try {
    const data = await emcClient.send(new CancelJobCommand(params));
    console.log(`Job  ${params.Id} is canceled`);
    return data;
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node ec2_canceljob.js 
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/mediaconvert/src/emc_canceljob.js)找到。

## 列出最近的转码作业
<a name="emc-examples-jobs-listing"></a>

创建文件名为 `emc_listjobs.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。

创建包括值的参数 JSON，这些值指定是按 `ASCENDING` 还是 `DESCENDING` 对列表排序、要检查的作业队列的 Amazon 资源名称 (ARN)，以及要包含的作业的状态。然后，通过创建一个 promise 来调用 `MediaConvert` 客户端服务对象并传递参数，以此调用 `ListJobsCommand` 方法。

**注意**  
将 *QUEUE\$1ARN* 替换为要检查的作业队列的 Amazon 资源名称 (ARN)，将 *STATUS* 替换为队列的状态。

```
// Import required AWS-SDK clients and commands for Node.js
import { ListJobsCommand } from "@aws-sdk/client-mediaconvert";
import { emcClient } from "./libs/emcClient.js";

// Set the parameters
const params = {
  MaxResults: 10,
  Order: "ASCENDING",
  Queue: "QUEUE_ARN",
  Status: "SUBMITTED", // e.g., "SUBMITTED"
};

const run = async () => {
  try {
    const data = await emcClient.send(new ListJobsCommand(params));
    console.log("Success. Jobs: ", data.Jobs);
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node emc_listjobs.js 
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/mediaconvert/src/emc_listjobs.js)找到。

# 在 MediaConvert 中使用作业模板
<a name="emc-examples-templates"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 如何创建 AWS Elemental MediaConvert 作业模板。
+ 如何使用作业模板来创建转码作业。
+ 如何列出您的所有作业模板。
+ 如何删除作业模板。

## 情景
<a name="emc-examples-templates-scenario"></a>

在 MediaConvert 中创建转码作业所需的 JSON 有详细说明，包含大量设置。您可以将已知工作正常的设置保存在作业模板中并用于创建以后的作业，从而节省大量时间。在此示例中，您使用 Node.js 模块调用 MediaConvert 来创建、使用和管理作业模板。该代码使用 SDK for JavaScript，通过 MediaConvert 客户端类的以下方法来完成此操作：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/CreateJobTemplateCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/CreateJobTemplateCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/CreateJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/CreateJobCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/DeleteJobTemplateCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/DeleteJobTemplateCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/ListJobTemplatesCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-mediaconvert/Class/ListJobTemplatesCommand/)

## 完成先决条件任务
<a name="emc-example-templates-prerequisites"></a>

要设置和运行此示例，请先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的 适用于 JavaScript 的 AWS SDK 和第三方模块。请按照 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/mediaconvert/README.md) 上的说明进行操作。
+ 使用用户凭证创建共享配置文件。有关提供共享凭证文件的更多信息，请参阅《AWS SDK 和工具参考指南》**中的[共享配置和凭证文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。
+ 创建一个 IAM 角色，该角色使 MediaConvert 能够访问输入文件以及存储输出文件的 Amazon S3 存储桶。有关更多信息，请参阅《AWS Elemental MediaConvert 用户指南》**中的[设置 IAM 权限](https://docs.aws.amazon.com/mediaconvert/latest/ug/iam-role.html)。

**重要**  
这些示例使用 ECMAScript6 (ES6)。这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。  
但是，如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 创建作业模板
<a name="emc-examples-templates-create"></a>

创建文件名为 `emc_create_jobtemplate.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。

指定用于创建模板的参数 JSON。您可以使用来自以前成功作业中的大部分 JSON 参数来指定模板中的 `Settings` 值。此示例使用来自 [在 MediaConvert 中创建和管理转码作业](emc-examples-jobs.md) 的作业设置。

通过创建一个 promise 来调用 `MediaConvert` 服务对象并传递参数，以此调用 `CreateJobTemplateCommand` 方法。

**注意**  
将 *JOB\$1QUEUE\$1ARN* 替换为要检查的作业队列的 Amazon 资源名称 (ARN)，将 *BUCKET\$1NAME* 替换为目标 Amazon S3 存储桶的名称，例如“s3://BUCKET\$1NAME/”。

```
// Import required AWS-SDK clients and commands for Node.js
import { CreateJobTemplateCommand } from "@aws-sdk/client-mediaconvert";
import { emcClient } from "./libs/emcClient.js";

const params = {
  Category: "YouTube Jobs",
  Description: "Final production transcode",
  Name: "DemoTemplate",
  Queue: "JOB_QUEUE_ARN", //JOB_QUEUE_ARN
  Settings: {
    OutputGroups: [
      {
        Name: "File Group",
        OutputGroupSettings: {
          Type: "FILE_GROUP_SETTINGS",
          FileGroupSettings: {
            Destination: "BUCKET_NAME", // BUCKET_NAME e.g., "s3://BUCKET_NAME/"
          },
        },
        Outputs: [
          {
            VideoDescription: {
              ScalingBehavior: "DEFAULT",
              TimecodeInsertion: "DISABLED",
              AntiAlias: "ENABLED",
              Sharpness: 50,
              CodecSettings: {
                Codec: "H_264",
                H264Settings: {
                  InterlaceMode: "PROGRESSIVE",
                  NumberReferenceFrames: 3,
                  Syntax: "DEFAULT",
                  Softness: 0,
                  GopClosedCadence: 1,
                  GopSize: 90,
                  Slices: 1,
                  GopBReference: "DISABLED",
                  SlowPal: "DISABLED",
                  SpatialAdaptiveQuantization: "ENABLED",
                  TemporalAdaptiveQuantization: "ENABLED",
                  FlickerAdaptiveQuantization: "DISABLED",
                  EntropyEncoding: "CABAC",
                  Bitrate: 5000000,
                  FramerateControl: "SPECIFIED",
                  RateControlMode: "CBR",
                  CodecProfile: "MAIN",
                  Telecine: "NONE",
                  MinIInterval: 0,
                  AdaptiveQuantization: "HIGH",
                  CodecLevel: "AUTO",
                  FieldEncoding: "PAFF",
                  SceneChangeDetect: "ENABLED",
                  QualityTuningLevel: "SINGLE_PASS",
                  FramerateConversionAlgorithm: "DUPLICATE_DROP",
                  UnregisteredSeiTimecode: "DISABLED",
                  GopSizeUnits: "FRAMES",
                  ParControl: "SPECIFIED",
                  NumberBFramesBetweenReferenceFrames: 2,
                  RepeatPps: "DISABLED",
                  FramerateNumerator: 30,
                  FramerateDenominator: 1,
                  ParNumerator: 1,
                  ParDenominator: 1,
                },
              },
              AfdSignaling: "NONE",
              DropFrameTimecode: "ENABLED",
              RespondToAfd: "NONE",
              ColorMetadata: "INSERT",
            },
            AudioDescriptions: [
              {
                AudioTypeControl: "FOLLOW_INPUT",
                CodecSettings: {
                  Codec: "AAC",
                  AacSettings: {
                    AudioDescriptionBroadcasterMix: "NORMAL",
                    RateControlMode: "CBR",
                    CodecProfile: "LC",
                    CodingMode: "CODING_MODE_2_0",
                    RawFormat: "NONE",
                    SampleRate: 48000,
                    Specification: "MPEG4",
                    Bitrate: 64000,
                  },
                },
                LanguageCodeControl: "FOLLOW_INPUT",
                AudioSourceName: "Audio Selector 1",
              },
            ],
            ContainerSettings: {
              Container: "MP4",
              Mp4Settings: {
                CslgAtom: "INCLUDE",
                FreeSpaceBox: "EXCLUDE",
                MoovPlacement: "PROGRESSIVE_DOWNLOAD",
              },
            },
            NameModifier: "_1",
          },
        ],
      },
    ],
    AdAvailOffset: 0,
    Inputs: [
      {
        AudioSelectors: {
          "Audio Selector 1": {
            Offset: 0,
            DefaultSelection: "NOT_DEFAULT",
            ProgramSelection: 1,
            SelectorType: "TRACK",
            Tracks: [1],
          },
        },
        VideoSelector: {
          ColorSpace: "FOLLOW",
        },
        FilterEnable: "AUTO",
        PsiControl: "USE_PSI",
        FilterStrength: 0,
        DeblockFilter: "DISABLED",
        DenoiseFilter: "DISABLED",
        TimecodeSource: "EMBEDDED",
      },
    ],
    TimecodeConfig: {
      Source: "EMBEDDED",
    },
  },
};

const run = async () => {
  try {
    // Create a promise on a MediaConvert object
    const data = await emcClient.send(new CreateJobTemplateCommand(params));
    console.log("Success!", data);
    return data;
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node emc_create_jobtemplate.js 
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/mediaconvert/src/emc_create_jobtemplate.js)找到。

## 从作业模板创建转码作业
<a name="emc-examples-templates-createjob"></a>

创建文件名为 `emc_template_createjob.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。

创建作业创建参数 JSON，其中包括要使用的作业模板名称，以及所要使用的特定于您正在创建的作业的 `Settings`。然后，通过创建一个 promise 来调用 `MediaConvert` 客户端服务对象并传递参数，以此调用 `CreateJobsCommand` 方法。

**注意**  
将 *JOB\$1QUEUE\$1ARN* 替换为要检查的作业队列的 Amazon 资源名称 (ARN)，将 *KEY\$1PAIR\$1NAME* 替换为，将 *TEMPLATE\$1 NAME* 替换为，将 *ROLE\$1ARN* 替换为 Amazon 资源名称（ARN），将 * INPUT\$1BUCKET\$1AND\$1FILENAME* 替换为输入存储桶和文件名，例如“s3://BUCKET\$1NAME/FILE\$1NAME”。

```
// Import required AWS-SDK clients and commands for Node.js
import { CreateJobCommand } from "@aws-sdk/client-mediaconvert";
import { emcClient } from "./libs/emcClient.js";

const params = {
  Queue: "QUEUE_ARN", //QUEUE_ARN
  JobTemplate: "TEMPLATE_NAME", //TEMPLATE_NAME
  Role: "ROLE_ARN", //ROLE_ARN
  Settings: {
    Inputs: [
      {
        AudioSelectors: {
          "Audio Selector 1": {
            Offset: 0,
            DefaultSelection: "NOT_DEFAULT",
            ProgramSelection: 1,
            SelectorType: "TRACK",
            Tracks: [1],
          },
        },
        VideoSelector: {
          ColorSpace: "FOLLOW",
        },
        FilterEnable: "AUTO",
        PsiControl: "USE_PSI",
        FilterStrength: 0,
        DeblockFilter: "DISABLED",
        DenoiseFilter: "DISABLED",
        TimecodeSource: "EMBEDDED",
        FileInput: "INPUT_BUCKET_AND_FILENAME", //INPUT_BUCKET_AND_FILENAME, e.g., "s3://BUCKET_NAME/FILE_NAME"
      },
    ],
  },
};

const run = async () => {
  try {
    const data = await emcClient.send(new CreateJobCommand(params));
    console.log("Success! ", data);
    return data;
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node emc_template_createjob.js 
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/mediaconvert/src/emc_template_createjob.js)找到。

## 列出作业模板
<a name="emc-examples-templates-listing"></a>

创建文件名为 `emc_listtemplates.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。

创建一个对象以传递 `listTemplates` 客户端类的 `MediaConvert` 方法的请求参数。包含值以确定要列出哪些模板（`NAME`、`CREATION DATE`、`SYSTEM`）、要列出多少个模板及其排序顺序。要调用 `ListTemplatesCommand` 方法，请创建一个 promise 来调用 MediaConvert 客户端服务对象并传递参数。

```
// Import required AWS-SDK clients and commands for Node.js
import { ListJobTemplatesCommand } from "@aws-sdk/client-mediaconvert";
import { emcClient } from "./libs/emcClient.js";

const params = {
  ListBy: "NAME",
  MaxResults: 10,
  Order: "ASCENDING",
};

const run = async () => {
  try {
    const data = await emcClient.send(new ListJobTemplatesCommand(params));
    console.log("Success ", data.JobTemplates);
    return data;
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node emc_listtemplates.js 
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/mediaconvert/src/emc_template_createjob.js)找到。

## 删除作业模板
<a name="emc-examples-templates-delete"></a>

创建文件名为 `emc_deletetemplate.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。

创建一个对象，以将您要删除的作业模板的名称作为 `DeleteJobTemplateCommand` 客户端类的 `MediaConvert` 方法的参数传递。要调用 `DeleteJobTemplateCommand` 方法，请创建一个 promise 来调用 MediaConvert 客户端服务对象并传递参数。

```
// Import required AWS-SDK clients and commands for Node.js
import { DeleteJobTemplateCommand } from "@aws-sdk/client-mediaconvert";
import { emcClient } from "./libs/emcClient.js";

// Set the parameters
const params = { Name: "test" }; //TEMPLATE_NAME

const run = async () => {
  try {
    const data = await emcClient.send(new DeleteJobTemplateCommand(params));
    console.log(
      "Success, template deleted! Request ID:",
      data.$metadata.requestId,
    );
    return data;
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node emc_deletetemplate.js 
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/mediaconvert/src/emc_deletetemplate.js)找到。

# AWS Lambda 示例
<a name="lambda-examples"></a>

AWS Lambda 是一项无服务器计算服务，可使您无需预置或管理服务器即可运行代码，创建工作负载感知型集群扩展逻辑，维护事件集成，或管理运行时。

适用于 AWS Lambda 的 JavaScript API 通过 [LambdaService](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-lambda/) 客户端类公开。

以下是演示如何借助 适用于 JavaScript 的 AWS SDK v3 创建和使用 Lambda 函数的示例列表：
+ [使用 API Gateway 调用 Lambda](api-gateway-invoking-lambda-example.md)
+ [创建计划事件以执行 AWS Lambda 函数](scheduled-events-invoking-lambda-example.md)

# Amazon Lex 示例
<a name="lex-examples"></a>

Amazon Lex 是一项用于使用语音和文本将对话界面内置到应用程序中的 AWS 服务。

适用于 Amazon Lex 的 JavaScript API 通过 [Lex Runtime Service](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-lex-runtime-service/) 客户端类公开。
+ [构建 Amazon Lex 聊天机器人](lex-bot-example.md)

# Amazon Polly 示例
<a name="polly-examples"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 将使用 Amazon Polly 录制的音频上传到 Amazon S3

## 情景
<a name="polly-example-synthesize-to-s3-scenario"></a>

在此示例中，将使用一系列 Node.js 模块，通过 Amazon S3 客户端类的以下方法将使用 Amazon Polly 录制的音频自动上传到 Amazon S3：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-polly/Class/StartSpeechSynthesisTaskCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-polly/Class/StartSpeechSynthesisTaskCommand/)

## 先决条件任务
<a name="polly-example-synthesize-to-s3-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 按照中的说明设置项目环境以运行 Node JavaScript 示例[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/s3/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。
+ 创建一个 AWS Identity and Access Management (IAM) 未经身份验证的 Amazon Cognito 用户角色投票SynthesizeSpeech ：权限，以及一个附有 IAM 角色的 Amazon Cognito 身份池。下面的[使用创建 AWS 资源 CloudFormation](#polly-example-synthesize-to-s3-create-resources)部分将介绍如何创建这些资源。

**注意**  
此示例使用 Amazon Cognito，但是如果您不使用 Amazon Cognito，则 AWS 您的用户必须具有以下 IAM 权限策略  

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "mobileanalytics:PutEvents",
        "cognito-sync:*"
      ],
      "Resource": "*",
      "Effect": "Allow"
    },
    {
      "Action": "polly:SynthesizeSpeech",
      "Resource": "*",
      "Effect": "Allow"
    }
  ]
}
```

## 使用创建 AWS 资源 CloudFormation
<a name="polly-example-synthesize-to-s3-create-resources"></a>

CloudFormation 使您能够以可预测的方式重复创建和配置 AWS 基础架构部署。有关的更多信息 CloudFormation，请参阅《[AWS CloudFormation 用户指南》](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/)。

要创建 CloudFormation 堆栈，请执行以下操作：

1. 按照《 AWS CLI [AWS CLI 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)》中的说明进行安装和配置。

1. 在项目文件夹的根目录`setup.yaml`中创建一个名为的文件，然后将[此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/polly/general-examples/src/setup.yaml)的内容复制 GitHub到该文件中。
**注意**  
该 CloudFormation 模板是使用[此处 AWS CDK 提供的模板生成的 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/resources/cdk/javascript_example_code_polly_aws_service/)。有关更多信息 AWS CDK，请参阅《[AWS Cloud Development Kit (AWS CDK) 开发人员指南》](https://docs.aws.amazon.com/cdk/latest/guide/)。

1. 从命令行运行以下命令，*STACK\$1NAME*替换为堆栈的唯一名称。
**重要**  
堆栈名称在 AWS 区域和 AWS 账户中必须是唯一的。您最多可指定 128 个字符，支持数字和连字符。

   ```
   aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM
   ```

   有关 `create-stack` 命令参数的更多信息，请参阅 [AWS CLI 命令参考指南](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html)和 [CloudFormation 用户指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html)。

1. 导航到 CloudFormation 管理控制台，选择**堆栈**，选择堆栈名称，然后选择**资源**选项卡以查看已创建资源的列表。  
![\[CloudFormation 资源\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/cfn_polly.png)

## 将使用 Amazon Polly 录制的音频上传到 Amazon S3
<a name="polly-example-synthesize-to-s3-example"></a>

创建文件名为 `polly_synthesize_to_s3.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。在代码中，输入*REGION*、和*BUCKET\$1NAME*。要访问 Amazon Polly，请创建一个 `Polly` 客户端服务对象。*"IDENTITY\$1POOL\$1ID"*替换为您为此**示例创建的 Amazon Cognito 身份池示例页面**中的。`IdentityPoolId`这也被传递给每个客户端对象。

调用 Amazon Polly 客户端服务对象的 `StartSpeechSynthesisCommand` 方法以合成语音消息，将其上传到 Amazon S3 存储桶。

```
import { StartSpeechSynthesisTaskCommand } from "@aws-sdk/client-polly";
import { pollyClient } from "./libs/pollyClient.js";

// Create the parameters
const params = {
  OutputFormat: "mp3",
  OutputS3BucketName: "videoanalyzerbucket",
  Text: "Hello David, How are you?",
  TextType: "text",
  VoiceId: "Joanna",
  SampleRate: "22050",
};

const run = async () => {
  try {
    await pollyClient.send(new StartSpeechSynthesisTaskCommand(params));
    console.log(`Success, audio file added to ${params.OutputS3BucketName}`);
  } catch (err) {
    console.log("Error putting object", err);
  }
};
run();
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/polly/general-examples/src/polly_synthesize_to_s3.js)示例代码 GitHub。

# Amazon Redshift 示例
<a name="redshift-examples"></a>

Amazon Redshift 是云中一种完全托管的 PB 级数据仓库服务。Amazon Redshift 数据仓库是一个由称作*节点*的各种计算资源构成的集合，这些节点已整理到名为*集群*的组中。每个集群运行一个 Amazon Redshift 引擎并包含一个或多个数据库。

![\[JavaScript 环境、SDK 与 Amazon Redshift 之间的关系\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/code-samples-redshift.png)


适用于 Amazon Redshift 的 JavaScript API 通过 [Amazon Redshift](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-redshift/Class/Redshift/) 客户端类公开。

**Topics**
+ [

# Amazon Redshift 示例
](redshift-examples-section.md)

# Amazon Redshift 示例
<a name="redshift-examples-section"></a>

此示例使用一系列 Node.js 模块来创建、修改、描述 Amazon Redshift 集群的参数，然后使用 `Redshift` 客户端类的以下方法删除这些集群：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-redshift/Class/CreateClusterCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-redshift/Class/CreateClusterCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-redshift/Class/ModifyClusterCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-redshift/Class/ModifyClusterCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-redshift/Class/DescribeClustersCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-redshift/Class/DescribeClustersCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-redshift/Class/DeleteClusterCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-redshift/Class/DeleteClusterCommand/)

有关 Amazon Redshift 用户的更多信息，请参阅 [Amazon Redshift 入门指南](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html)。

## 先决条件任务
<a name="s3-example-configuring-buckets-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的 适用于 JavaScript 的 AWS SDK 和第三方模块。请按照 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/redshift/README.md) 上的说明进行操作。
+ 使用用户凭证创建共享配置文件。有关提供共享凭证文件的更多信息，请参阅《AWS SDK 和工具参考指南》** 中的[共享配置和凭证文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6（ES6）导入/导出客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)

## 创建 Amazon Redshift 集群
<a name="redshift-create-cluster"></a>

此示例演示如何使用 适用于 JavaScript 的 AWS SDK 创建 Amazon Redshift 集群。有关更多信息，请参阅 [CreateCluster](https://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateCluster)。

**重要**  
*您即将创建的集群将是活跃的（且不在沙盒中运行）。您需要为该集群支付标准 Amazon Redshift 使用费，直到删除它为止。如果您在创建集群的相同位置删除了集群，则产生的总费用其实是很少的。*

创建一个 `libs` 目录，然后使用文件名 `redshiftClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Redshift 客户端对象。将 *REGION* 替换为您的 AWS 区域。

```
import  { RedshiftClient }  from  "@aws-sdk/client-redshift";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create Redshift service object.
const redshiftClient = new RedshiftClient({ region: REGION });
export { redshiftClient };
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/redshift/src/libs/redshiftClient.js)找到。

创建文件名为 `redshift-create-cluster.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。创建参数对象，指定要预置的节点类型，以及在集群中自动创建的数据库实例的主登录凭证，最后指定集群类型。

**注意**  
将 *CLUSTER\$1NAME* 替换为集群的名称。对于 *NODE\$1TYPE*，请指定要预置的节点类型，例如 “dc2.large”。*MASTER\$1USERNAME* 和 *MASTER\$1USER\$1PASSWORD* 是集群中数据库实例的主用户的登录凭证。对于 *CLUSTER\$1TYPE*，输入集群的类型。如果指定 `single-node`，则不需要 `NumberOfNodes` 参数。其余参数均为可选参数。

```
// Import required AWS SDK clients and commands for Node.js
import { CreateClusterCommand } from "@aws-sdk/client-redshift";
import { redshiftClient } from "./libs/redshiftClient.js";

const params = {
  ClusterIdentifier: "CLUSTER_NAME", // Required
  NodeType: "NODE_TYPE", //Required
  MasterUsername: "MASTER_USER_NAME", // Required - must be lowercase
  MasterUserPassword: "MASTER_USER_PASSWORD", // Required - must contain at least one uppercase letter, and one number
  ClusterType: "CLUSTER_TYPE", // Required
  IAMRoleARN: "IAM_ROLE_ARN", // Optional - the ARN of an IAM role with permissions your cluster needs to access other AWS services on your behalf, such as Amazon S3.
  ClusterSubnetGroupName: "CLUSTER_SUBNET_GROUPNAME", //Optional - the name of a cluster subnet group to be associated with this cluster. Defaults to 'default' if not specified.
  DBName: "DATABASE_NAME", // Optional - defaults to 'dev' if not specified
  Port: "PORT_NUMBER", // Optional - defaults to '5439' if not specified
};

const run = async () => {
  try {
    const data = await redshiftClient.send(new CreateClusterCommand(params));
    console.log(
      `Cluster ${data.Cluster.ClusterIdentifier} successfully created`,
    );
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node redshift-create-cluster.js  
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/redshift/src/redshift-create-cluster.js)找到。

## 修改 Amazon Redshift 集群
<a name="redshift-modify-cluster"></a>

此示例展示了如何使用 适用于 JavaScript 的 AWS SDK 修改 Amazon Redshift 集群的主用户密码。有关您可以修改的其他设置的更多信息，请参阅 [ModifyCluster](https://docs.aws.amazon.com/redshift/latest/APIReference/API_ModifyCluster.html)。

创建一个 `libs` 目录，然后使用文件名 `redshiftClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Redshift 客户端对象。将 *REGION* 替换为您的 AWS 区域。

```
import  { RedshiftClient }  from  "@aws-sdk/client-redshift";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create Redshift service object.
const redshiftClient = new RedshiftClient({ region: REGION });
export { redshiftClient };
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/redshift/src/libs/redshiftClient.js)找到。

创建文件名为 `redshift-modify-cluster.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。指定 AWS 区域、要修改的集群名称和新的主用户密码。

**注意**  
将 *CLUSTER\$1NAME* 替换为集群名称，将 *MASTER\$1USER\$1PASSWORD* 替换为新的主用户密码。

```
// Import required AWS SDK clients and commands for Node.js
import { ModifyClusterCommand } from "@aws-sdk/client-redshift";
import { redshiftClient } from "./libs/redshiftClient.js";

// Set the parameters
const params = {
  ClusterIdentifier: "CLUSTER_NAME",
  MasterUserPassword: "NEW_MASTER_USER_PASSWORD",
};

const run = async () => {
  try {
    const data = await redshiftClient.send(new ModifyClusterCommand(params));
    console.log("Success was modified.", data);
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node redshift-modify-cluster.js 
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/redshift/src/redshift-modify-cluster.js)找到。

## 查看 Amazon Redshift 集群的详细信息
<a name="redshift-describe-cluster"></a>

此示例说明了如何使用 适用于 JavaScript 的 AWS SDK 查看 Amazon Redshift 集群的详细信息。有关可选内容的更多信息，请参见 [DescribeClusters](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html)。

创建一个 `libs` 目录，然后使用文件名 `redshiftClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Redshift 客户端对象。将 *REGION* 替换为您的 AWS 区域。

```
import  { RedshiftClient }  from  "@aws-sdk/client-redshift";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create Redshift service object.
const redshiftClient = new RedshiftClient({ region: REGION });
export { redshiftClient };
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/redshift/src/libs/redshiftClient.js)找到。

创建文件名为 `redshift-describe-clusters.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。指定 AWS 区域、要修改的集群名称和新的主用户密码。

**注意**  
将 *CLUSTER\$1NAME* 替换为集群的名称。

```
// Import required AWS SDK clients and commands for Node.js
import { DescribeClustersCommand } from "@aws-sdk/client-redshift";
import { redshiftClient } from "./libs/redshiftClient.js";

const params = {
  ClusterIdentifier: "CLUSTER_NAME",
};

const run = async () => {
  try {
    const data = await redshiftClient.send(new DescribeClustersCommand(params));
    console.log("Success", data);
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node redshift-describe-clusters.js 
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/redshift/src/redshift-describe-clusters.js)找到。

## 删除 Amazon Redshift 集群
<a name="redshift-delete-cluster"></a>

此示例说明了如何使用 适用于 JavaScript 的 AWS SDK 查看 Amazon Redshift 集群的详细信息。有关您可以删除的其他设置的更多信息，请参阅 [DeleteCluster](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteCluster.html)。

创建一个 `libs` 目录，然后使用文件名 `redshiftClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Redshift 客户端对象。将 *REGION* 替换为您的 AWS 区域。

```
import  { RedshiftClient }  from  "@aws-sdk/client-redshift";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create Redshift service object.
const redshiftClient = new RedshiftClient({ region: REGION });
export { redshiftClient };
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/redshift/src/libs/redshiftClient.js)找到。

创建文件名为 `redshift-delete-clusters.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。指定 AWS 区域、要修改的集群名称和新的主用户密码。指定是否要在删除集群之前保存集群的最终快照，如果是，则指定快照的 ID。

**注意**  
将 *CLUSTER\$1NAME* 替换为集群的名称。对于 *SkipFinalClusterSnapshot*，请指定是否要在删除集群前对其创建最终快照。如果指定“false”，请在 *CLUSTER\$1SNAPSHOT\$1ID* 中指定最终集群快照的 ID。要获取此 ID，请单击**集群**仪表板上集群对应的**快照**列中的链接，然后滚动到**快照**窗格。请注意，词干 `rs:` 不是快照 ID 的一部分。

```
// Import required AWS SDK clients and commands for Node.js
import { DeleteClusterCommand } from "@aws-sdk/client-redshift";
import { redshiftClient } from "./libs/redshiftClient.js";

const params = {
  ClusterIdentifier: "CLUSTER_NAME",
  SkipFinalClusterSnapshot: false,
  FinalClusterSnapshotIdentifier: "CLUSTER_SNAPSHOT_ID",
};

const run = async () => {
  try {
    const data = await redshiftClient.send(new DeleteClusterCommand(params));
    console.log("Success, cluster deleted. ", data);
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node redshift-delete-cluster.js  
```

此示例代码可在 [GitHub 上的此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/redshift/src/redshift-delete-cluster.js)找到。

# Amazon Simple Email Service 示例
<a name="ses-examples"></a>

Amazon Simple Email Service（Amazon SES）是一项基于云的电子邮件发送服务，旨在帮助数字营销人员和应用程序开发人员发送营销、通知和事务电子邮件。对于使用电子邮件联系客户的所有规模的企业来说，它是一种可靠且经济实用的服务。

![\[JavaScript 环境、软件开发工具包和 Amazon SES 之间的关系\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/code-samples-ses.png)


Amazon SES 的 JavaScript API 通过`SES`客户端类公开。有关使用 Amazon SES 客户端类的更多信息，请参阅《API 参考》中的[类：SES](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/SES/)。

**Topics**
+ [

# 管理 Amazon SES 身份
](ses-examples-managing-identities.md)
+ [

# 在 Amazon SES 中使用电子邮件模板
](ses-examples-creating-template.md)
+ [

# 使用 Amazon SES 发送电子邮件
](ses-examples-sending-email.md)

# 管理 Amazon SES 身份
<a name="ses-examples-managing-identities"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 如何验证用于 Amazon SES 的电子邮件地址和域。
+ 如何为您的 Amazon SES 身份分配 AWS Identity and Access Management (IAM) 策略。
+ 如何列出您 AWS 账户的所有 Amazon SES 身份。
+ 如何删除用于 Amazon SES 的身份。

Amazon SES *身份* 是 Amazon SES 用来发送电子邮件的电子邮件地址或域。Amazon SES 要求您验证电子邮件身份，以确认您拥有该身份，并防止他人使用。

有关如何在 Amazon SES 中验证电子邮件地址和域名的详细信息，请参阅《Amazon Simple Email Service 开发人员指南》中的[在 Amazon SES 中验证电子邮件地址和域](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-addresses-and-domains.html)。有关在 Amazon SES 中发送授权的信息，请参阅 [Amazon SES 发送授权概述](Amazon Simple Email Service Developer Guidesending-authorization-overview.html)。

## 情景
<a name="ses-examples-verifying-identities-scenario"></a>

在本示例中，您使用一系列 Node.js 模块验证和管理 Amazon SES 身份。Node.js 模块使用的 SDK JavaScript 来验证电子邮件地址和域名，使用`SES`客户端类的以下方法：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/ListIdentitiesCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/ListIdentitiesCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/DeleteIdentityCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/DeleteIdentityCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/VerifyEmailIdentityCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/VerifyEmailIdentityCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/VerifyDomainIdentityCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/VerifyDomainIdentityCommand/)

## 完成先决条件任务
<a name="ses-examples-verifying-identities-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/ses/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6 (ES6) 来 import/export 客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 列出身份
<a name="ses-examples-listing-identities"></a>

在本示例中，使用 Node.js 模块列出用于 Amazon SES 的电子邮件地址和域。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_listidentities.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建对象，为 `SES` 客户端类的 `ListIdentitiesCommand` 方法传递 `IdentityType` 及其他参数。要调用 `ListIdentitiesCommand` 方法，请调用一个 Amazon SES 服务对象来传递参数对象。

 返回的 `data` 包含 `IdentityType` 参数所指定的域身份数组。

**注意**  
*IdentityType*替换为身份类型，可以是 “EmailAddress” 或 “域”。

```
import { ListIdentitiesCommand } from "@aws-sdk/client-ses";
import { sesClient } from "./libs/sesClient.js";

const createListIdentitiesCommand = () =>
  new ListIdentitiesCommand({ IdentityType: "EmailAddress", MaxItems: 10 });

const run = async () => {
  const listIdentitiesCommand = createListIdentitiesCommand();

  try {
    return await sesClient.send(listIdentitiesCommand);
  } catch (err) {
    console.log("Failed to list identities.", err);
    return err;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node ses_listidentities.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_listidentities.js)示例代码 GitHub。

## 验证电子邮件地址身份
<a name="ses-examples-verifying-email"></a>

在本示例中，使用 Node.js 模块验证用于 Amazon SES 的电子邮件发送方。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_verifyemailidentity.js` 的 Node.js 模块。如前所示配置 SDK，包括下载所需的客户端和软件包。

创建对象，为 `SES` 客户端类的 `VerifyEmailIdentityCommand` 方法传递 `EmailAddress` 参数。要调用 `VerifyEmailIdentityCommand` 方法，请调用一个 Amazon SES 客户端服务对象来传递参数。

**注意**  
*EMAIL\$1ADDRESS*替换为电子邮件地址，例如 name@example.com。

```
// Import required AWS SDK clients and commands for Node.js
import { VerifyEmailIdentityCommand } from "@aws-sdk/client-ses";
import { sesClient } from "./libs/sesClient.js";

const EMAIL_ADDRESS = "name@example.com";

const createVerifyEmailIdentityCommand = (emailAddress) => {
  return new VerifyEmailIdentityCommand({ EmailAddress: emailAddress });
};

const run = async () => {
  const verifyEmailIdentityCommand =
    createVerifyEmailIdentityCommand(EMAIL_ADDRESS);
  try {
    return await sesClient.send(verifyEmailIdentityCommand);
  } catch (err) {
    console.log("Failed to verify email identity.", err);
    return err;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。域会添加到 Amazon SES 等待验证。

```
node ses_verifyemailidentity.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_verifyemailidentity.js)示例代码 GitHub。

## 验证域身份
<a name="ses-examples-verifying-domains"></a>

在本示例中，使用 Node.js 模块验证用于 Amazon SES 的电子邮件域。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_verifydomainidentity.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建对象，为 `SES` 客户端类的 `VerifyDomainIdentityCommand` 方法传递 `Domain` 参数。要调用 `VerifyDomainIdentityCommand` 方法，请调用一个 Amazon SES 客户端服务对象来传递参数对象。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

**注意**  
*DOMAIN\$1NAME*替换为域名。

```
import { VerifyDomainIdentityCommand } from "@aws-sdk/client-ses";
import {
  getUniqueName,
  postfix,
} from "@aws-doc-sdk-examples/lib/utils/util-string.js";
import { sesClient } from "./libs/sesClient.js";

/**
 * You must have access to the domain's DNS settings to complete the
 * domain verification process.
 */
const DOMAIN_NAME = postfix(getUniqueName("Domain"), ".example.com");

const createVerifyDomainIdentityCommand = () => {
  return new VerifyDomainIdentityCommand({ Domain: DOMAIN_NAME });
};

const run = async () => {
  const VerifyDomainIdentityCommand = createVerifyDomainIdentityCommand();

  try {
    return await sesClient.send(VerifyDomainIdentityCommand);
  } catch (err) {
    console.log("Failed to verify domain.", err);
    return err;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。域会添加到 Amazon SES 等待验证。

```
node ses_verifydomainidentity.js  
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_verifydomainidentity.js)示例代码 GitHub。

## 删除身份
<a name="ses-examples-deleting-identities"></a>

在本示例中，使用 Node.js 模块删除用于 Amazon SES 的电子邮件地址或域。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_deleteidentity.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建对象，为 `SES` 客户端类的 `DeleteIdentityCommand` 方法传递 `Identity` 参数。要调用 `DeleteIdentityCommand` 方法，请创建一个 `request` 来调用 Amazon SES 客户端服务对象并传递参数。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

**注意**  
*IDENTITY\$1EMAIL*替换为要删除的身份的电子邮件。

```
import { DeleteIdentityCommand } from "@aws-sdk/client-ses";
import { sesClient } from "./libs/sesClient.js";

const IDENTITY_EMAIL = "fake@example.com";

const createDeleteIdentityCommand = (identityName) => {
  return new DeleteIdentityCommand({
    Identity: identityName,
  });
};

const run = async () => {
  const deleteIdentityCommand = createDeleteIdentityCommand(IDENTITY_EMAIL);

  try {
    return await sesClient.send(deleteIdentityCommand);
  } catch (err) {
    console.log("Failed to delete identity.", err);
    return err;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node ses_deleteidentity.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_deleteidentity.js)示例代码 GitHub。

# 在 Amazon SES 中使用电子邮件模板
<a name="ses-examples-creating-template"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 如何获取所有电子邮件模板的列表。
+ 如何检索和更新电子邮件模板。
+ 如何创建和删除电子邮件模板。

通过 Amazon SES，您可以使用电子邮件模板发送个性化的电子邮件。有关如何在 Amazon SES 中创建和使用电子邮件模板的详细信息，请参阅《Amazon Simple Email Service 开发人员指南》中的[通过 Amazon SES API 发送个性化电子邮件](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-personalized-email-api.html)。

## 情景
<a name="ses-examples-creating-template-scenario"></a>

在本示例中，您使用一系列 Node.js 模块来处理电子邮件模板。Node.js 模块使用的 SDK JavaScript ，使用`SES`客户端类的以下方法来创建和使用电子邮件模板：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/ListTemplatesCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/ListTemplatesCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/CreateTemplateCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/CreateTemplateCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/GetTemplateCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/GetTemplateCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/DeleteTemplateCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/DeleteTemplateCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/UpdateTemplateCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/UpdateTemplateCommand/)

## 完成先决条件任务
<a name="ses-examples-creating-template-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/ses/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6 (ES6) 来 import/export 客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 列出电子邮件模板
<a name="ses-examples-listing-templates"></a>

在本示例中，使用 Node.js 模块创建用于 Amazon SES 的电子邮件模板。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_listtemplates.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建对象，为 `SES` 客户端类的 `ListTemplatesCommand` 方法传递参数。要调用 `ListTemplatesCommand` 方法，请调用一个 Amazon SES 客户端服务对象来传递参数。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

```
import { ListTemplatesCommand } from "@aws-sdk/client-ses";
import { sesClient } from "./libs/sesClient.js";

const createListTemplatesCommand = (maxItems) =>
  new ListTemplatesCommand({ MaxItems: maxItems });

const run = async () => {
  const listTemplatesCommand = createListTemplatesCommand(10);

  try {
    return await sesClient.send(listTemplatesCommand);
  } catch (err) {
    console.log("Failed to list templates.", err);
    return err;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。Amazon SES 会返回模板列表。

```
node ses_listtemplates.js  
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_listtemplates.js)示例代码 GitHub。

## 获取电子邮件模板
<a name="ses-examples-get-template"></a>

在本示例中，使用 Node.js 模块获取用于 Amazon SES 的电子邮件模板。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_gettemplate.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建对象，为 `SES` 客户端类的 `GetTemplateCommand` 方法传递 `TemplateName` 参数。要调用 `GetTemplateCommand` 方法，请调用一个 Amazon SES 客户端服务对象来传递参数。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

**注意**  
*TEMPLATE\$1NAME*替换为要返回的模板的名称。

```
import { GetTemplateCommand } from "@aws-sdk/client-ses";
import { getUniqueName } from "@aws-doc-sdk-examples/lib/utils/util-string.js";
import { sesClient } from "./libs/sesClient.js";

const TEMPLATE_NAME = getUniqueName("TemplateName");

const createGetTemplateCommand = (templateName) =>
  new GetTemplateCommand({ TemplateName: templateName });

const run = async () => {
  const getTemplateCommand = createGetTemplateCommand(TEMPLATE_NAME);

  try {
    return await sesClient.send(getTemplateCommand);
  } catch (caught) {
    if (caught instanceof Error && caught.name === "MessageRejected") {
      /** @type { import('@aws-sdk/client-ses').MessageRejected} */
      const messageRejectedError = caught;
      return messageRejectedError;
    }
    throw caught;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。Amazon SES 会返回模板详细信息。

```
node ses_gettemplate.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_gettemplate.js)示例代码 GitHub。

## 创建电子邮件模板
<a name="ses-examples-create-template"></a>

在本示例中，使用 Node.js 模块创建用于 Amazon SES 的电子邮件模板。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_createtemplate.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建一个对象来为 `SES` 客户端类的 `CreateTemplateCommand` 方法传递参数，其中包括 `TemplateName`、`HtmlPart`、`SubjectPart` 和 `TextPart`。要调用 `CreateTemplateCommand` 方法，请调用一个 Amazon SES 客户端服务对象来传递参数。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

**注意**  
替换*TEMPLATE\$1NAME*为新模板的名称、*HtmlPart*带有 HTML 标签的电子邮件内容以及*SubjectPart*电子邮件的主题。

```
import { CreateTemplateCommand } from "@aws-sdk/client-ses";
import { sesClient } from "./libs/sesClient.js";
import { getUniqueName } from "@aws-doc-sdk-examples/lib/utils/util-string.js";

const TEMPLATE_NAME = getUniqueName("TestTemplateName");

const createCreateTemplateCommand = () => {
  return new CreateTemplateCommand({
    /**
     * The template feature in Amazon SES is based on the Handlebars template system.
     */
    Template: {
      /**
       * The name of an existing template in Amazon SES.
       */
      TemplateName: TEMPLATE_NAME,
      HtmlPart: `
        <h1>Hello, {{contact.firstName}}!</h1>
        <p>
        Did you know Amazon has a mascot named Peccy?
        </p>
      `,
      SubjectPart: "Amazon Tip",
    },
  });
};

const run = async () => {
  const createTemplateCommand = createCreateTemplateCommand();

  try {
    return await sesClient.send(createTemplateCommand);
  } catch (err) {
    console.log("Failed to create template.", err);
    return err;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。该模板已添加到 Amazon SES。

```
node ses_createtemplate.js  
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_createtemplate.js)示例代码 GitHub。

## 更新电子邮件模板
<a name="ses-examples-update-template"></a>

在本示例中，使用 Node.js 模块创建用于 Amazon SES 的电子邮件模板。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_updatetemplate.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建一个对象来传递您在模板中要更新的 `Template` 参数值，并将必需的 `TemplateName` 参数传递到 `SES` 客户端类的 `UpdateTemplateCommand` 方法。要调用 `UpdateTemplateCommand` 方法，请调用一个 Amazon SES 服务对象来传递参数。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

**注意**  
替换*TEMPLATE\$1NAME*为模板名称和*HTML\$1PART*带有 HTML 标签的电子邮件内容。

```
import { UpdateTemplateCommand } from "@aws-sdk/client-ses";
import { getUniqueName } from "@aws-doc-sdk-examples/lib/utils/util-string.js";
import { sesClient } from "./libs/sesClient.js";

const TEMPLATE_NAME = getUniqueName("TemplateName");
const HTML_PART = "<h1>Hello, World!</h1>";

const createUpdateTemplateCommand = () => {
  return new UpdateTemplateCommand({
    Template: {
      TemplateName: TEMPLATE_NAME,
      HtmlPart: HTML_PART,
      SubjectPart: "Example",
      TextPart: "Updated template text.",
    },
  });
};

const run = async () => {
  const updateTemplateCommand = createUpdateTemplateCommand();

  try {
    return await sesClient.send(updateTemplateCommand);
  } catch (err) {
    console.log("Failed to update template.", err);
    return err;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。Amazon SES 会返回模板详细信息。

```
node ses_updatetemplate.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_updatetemplate.js)示例代码 GitHub。

## 删除电子邮件模板
<a name="ses-examples-delete-template"></a>

在本示例中，使用 Node.js 模块创建用于 Amazon SES 的电子邮件模板。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_deletetemplate.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建对象，将必需的 `TemplateName` 参数传递到 `SES` 客户端类的 `DeleteTemplateCommand` 方法。要调用 `DeleteTemplateCommand` 方法，请调用一个 Amazon SES 服务对象来传递参数。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

**注意**  
*TEMPLATE\$1NAME*替换为要删除的模板的名称。

```
import { DeleteTemplateCommand } from "@aws-sdk/client-ses";
import { getUniqueName } from "@aws-doc-sdk-examples/lib/utils/util-string.js";
import { sesClient } from "./libs/sesClient.js";

const TEMPLATE_NAME = getUniqueName("TemplateName");

const createDeleteTemplateCommand = (templateName) =>
  new DeleteTemplateCommand({ TemplateName: templateName });

const run = async () => {
  const deleteTemplateCommand = createDeleteTemplateCommand(TEMPLATE_NAME);

  try {
    return await sesClient.send(deleteTemplateCommand);
  } catch (err) {
    console.log("Failed to delete template.", err);
    return err;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。Amazon SES 会返回模板详细信息。

```
node ses_deletetemplate.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_deletetemplate.js)示例代码 GitHub。

# 使用 Amazon SES 发送电子邮件
<a name="ses-examples-sending-email"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 发送文本或 HTML 电子邮件。
+ 根据电子邮件模板发送电子邮件。
+ 根据电子邮件模板批量发送电子邮件。

Amazon SES API 为您提供了两种不同的方法来发送电子邮件，具体取决于您对电子邮件内容的控制程度：格式化和原始。有关详细信息，请参阅[使用 Amazon SES API 发送格式化电子邮件](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-formatted.html)和[使用 Amazon SES API 发送原始电子邮件](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-raw.html)。

## 情景
<a name="ses-examples-sending-email-scenario"></a>

在本示例中，您使用一系列 Node.js 模块以多种方式发送电子邮件。Node.js 模块使用的 SDK JavaScript ，使用`SES`客户端类的以下方法来创建和使用电子邮件模板：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/SendEmailCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/SendEmailCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/SendTemplatedEmailCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/SendTemplatedEmailCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/SendBulkTemplatedEmailCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-ses/Class/SendBulkTemplatedEmailCommand/)

## 完成先决条件任务
<a name="ses-examples-sending-emails-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/ses/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6 (ES6) 来 import/export 客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 电子邮件发送要求
<a name="ses-examples-sending-msail-reqs"></a>

Amazon SES 编写电子邮件并立即将其加入队列等待发送。要使用 `SendEmailCommand` 方法发送电子邮件，您的邮件必须满足以下要求：
+ 您必须从已验证的电子邮件地址或域发送邮件。如果您尝试使用未验证的地址或域发送电子邮件，则操作会导致 `"Email address not verified"` 错误。
+ 如果您的账户仍在 Amazon SES 沙盒中，则只能发送到经验证的地址或域，或者与 Amazon SES 邮箱模拟器关联的电子邮件地址。有关更多信息，请参阅《Amazon Simple Email Service 开发人员指南》中的[验证电子邮件地址和域](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-addresses-and-domains.html)。
+ 邮件（包括附件）的总大小必须小于 10 MB。
+ 邮件必须包含至少一个收件人电子邮件地址。收件人地址可以是“收件人：”地址、“抄送：”地址或“密件抄送：”地址。如果某个收件人的电子邮件地址无效（即，未使用格式 `UserName@[SubDomain.]Domain.TopLevelDomain`），则将拒绝整个邮件，即使邮件包含的其他收件人有效。
+ 邮件在“收件人：”、“抄送：”和“密件抄送：”字段中包含的收件人不能超过 50 个。如果您需要将电子邮件发送给更多的受众，可以将收件人列表划分为不超过 50 个人的组，然后多次调用 `sendEmail` 方法来发送邮件到各个组。

## 发送电子邮件
<a name="ses-examples-sendmail"></a>

在本示例中，使用 Node.js 模块通过 Amazon SES 发送电子邮件。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_sendemail.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建一个对象以将定义要发送的电子邮件的参数值传递到 `SES` 客户端类的 `SendEmailCommand` 方法，这些参数值包括发件人和收件人地址、主题、纯文本和 HTML 格式的电子邮件正文。要调用 `SendEmailCommand` 方法，请调用一个 Amazon SES 服务对象来传递参数。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

**注意**  
*toAddress*替换为发送电子邮件的地址*fromAddress*，以及用于发送电子邮件的电子邮件地址。

```
import { SendEmailCommand } from "@aws-sdk/client-ses";
import { sesClient } from "./libs/sesClient.js";

const createSendEmailCommand = (toAddress, fromAddress) => {
  return new SendEmailCommand({
    Destination: {
      /* required */
      CcAddresses: [
        /* more items */
      ],
      ToAddresses: [
        toAddress,
        /* more To-email addresses */
      ],
    },
    Message: {
      /* required */
      Body: {
        /* required */
        Html: {
          Charset: "UTF-8",
          Data: "HTML_FORMAT_BODY",
        },
        Text: {
          Charset: "UTF-8",
          Data: "TEXT_FORMAT_BODY",
        },
      },
      Subject: {
        Charset: "UTF-8",
        Data: "EMAIL_SUBJECT",
      },
    },
    Source: fromAddress,
    ReplyToAddresses: [
      /* more items */
    ],
  });
};

const run = async () => {
  const sendEmailCommand = createSendEmailCommand(
    "recipient@example.com",
    "sender@example.com",
  );

  try {
    return await sesClient.send(sendEmailCommand);
  } catch (caught) {
    if (caught instanceof Error && caught.name === "MessageRejected") {
      /** @type { import('@aws-sdk/client-ses').MessageRejected} */
      const messageRejectedError = caught;
      return messageRejectedError;
    }
    throw caught;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。电子邮件会排队，等待由 Amazon SES 发送。

```
node ses_sendemail.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_sendemail.js)示例代码 GitHub。

## 使用模板发送电子邮件
<a name="ses-examples-sendtemplatedemail"></a>

在本示例中，使用 Node.js 模块通过 Amazon SES 发送电子邮件。创建文件名为 `ses_sendtemplatedemail.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建一个对象以将定义要发送的电子邮件的参数值传递到 `SES` 客户端类的 `SendTemplatedEmailCommand` 方法，这些参数值包括发件人和收件人地址、主题、纯文本和 HTML 格式的电子邮件正文。要调用 `SendTemplatedEmailCommand` 方法，请调用一个 Amazon SES 客户端服务对象来传递参数。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

**注意**  
*REGION*替换为您 AWS 所在的地区、*USER*发送电子邮件的姓名和电子邮件地址、*VERIFIED\$1EMAIL*用于发送电子邮件的电子邮件地址以及模板*TEMPLATE\$1NAME*的名称。

```
import { SendTemplatedEmailCommand } from "@aws-sdk/client-ses";
import {
  getUniqueName,
  postfix,
} from "@aws-doc-sdk-examples/lib/utils/util-string.js";
import { sesClient } from "./libs/sesClient.js";

/**
 * Replace this with the name of an existing template.
 */
const TEMPLATE_NAME = getUniqueName("ReminderTemplate");

/**
 * Replace these with existing verified emails.
 */
const VERIFIED_EMAIL = postfix(getUniqueName("Bilbo"), "@example.com");

const USER = { firstName: "Bilbo", emailAddress: VERIFIED_EMAIL };

/**
 *
 * @param { { emailAddress: string, firstName: string } } user
 * @param { string } templateName - The name of an existing template in Amazon SES.
 * @returns { SendTemplatedEmailCommand }
 */
const createReminderEmailCommand = (user, templateName) => {
  return new SendTemplatedEmailCommand({
    /**
     * Here's an example of how a template would be replaced with user data:
     * Template: <h1>Hello {{contact.firstName}},</h1><p>Don't forget about the party gifts!</p>
     * Destination: <h1>Hello Bilbo,</h1><p>Don't forget about the party gifts!</p>
     */
    Destination: { ToAddresses: [user.emailAddress] },
    TemplateData: JSON.stringify({ contact: { firstName: user.firstName } }),
    Source: VERIFIED_EMAIL,
    Template: templateName,
  });
};

const run = async () => {
  const sendReminderEmailCommand = createReminderEmailCommand(
    USER,
    TEMPLATE_NAME,
  );
  try {
    return await sesClient.send(sendReminderEmailCommand);
  } catch (caught) {
    if (caught instanceof Error && caught.name === "MessageRejected") {
      /** @type { import('@aws-sdk/client-ses').MessageRejected} */
      const messageRejectedError = caught;
      return messageRejectedError;
    }
    throw caught;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。电子邮件会排队，等待由 Amazon SES 发送。

```
node ses_sendtemplatedemail.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_sendtemplatedemail.js)示例代码 GitHub。

## 使用模板批量发送电子邮件
<a name="ses-examples-sendbulktemplatedemail"></a>

在本示例中，使用 Node.js 模块通过 Amazon SES 发送电子邮件。

创建一个 `libs` 目录，然后使用文件名 `sesClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SES 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SESClient } from "@aws-sdk/client-ses";
// Set the AWS Region.
const REGION = "us-east-1";
// Credentials are automatically resolved using the AWS SDK credential provider chain.
// For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
// Create SES service object.
const sesClient = new SESClient({ region: REGION });
export { sesClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/libs/sesClient.js)示例代码 GitHub。

创建文件名为 `ses_sendbulktemplatedemail.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建一个对象以将定义要发送的电子邮件的参数值传递到 `SES` 客户端类的 `SendBulkTemplatedEmailCommand` 方法，这些参数值包括发件人和收件人地址、主题、纯文本和 HTML 格式的电子邮件正文。要调用 `SendBulkTemplatedEmailCommand` 方法，请调用一个 Amazon SES 服务对象来传递参数。

**注意**  
此示例导入并使用所需的 S AWS ervice V3 包客户端、V3 命令，并以某种 async/await 模式使用该`send`方法。您可以改用 V2 命令创建此示例，方法是进行一些细微的更改。有关更多信息，请参阅 [使用 v3 命令](migrating.md#using_v3_commands)。

**注意**  
*USERS*替换为要向其发送电子邮件的姓名和电子邮件地址、*VERIFIED\$1EMAIL\$11*用于发送电子邮件的电子邮件地址以及*TEMPLATE\$1NAME*模板的名称。

```
import { SendBulkTemplatedEmailCommand } from "@aws-sdk/client-ses";
import {
  getUniqueName,
  postfix,
} from "@aws-doc-sdk-examples/lib/utils/util-string.js";
import { sesClient } from "./libs/sesClient.js";

/**
 * Replace this with the name of an existing template.
 */
const TEMPLATE_NAME = getUniqueName("ReminderTemplate");

/**
 * Replace these with existing verified emails.
 */
const VERIFIED_EMAIL_1 = postfix(getUniqueName("Bilbo"), "@example.com");
const VERIFIED_EMAIL_2 = postfix(getUniqueName("Frodo"), "@example.com");

const USERS = [
  { firstName: "Bilbo", emailAddress: VERIFIED_EMAIL_1 },
  { firstName: "Frodo", emailAddress: VERIFIED_EMAIL_2 },
];

/**
 *
 * @param { { emailAddress: string, firstName: string }[] } users
 * @param { string } templateName the name of an existing template in SES
 * @returns { SendBulkTemplatedEmailCommand }
 */
const createBulkReminderEmailCommand = (users, templateName) => {
  return new SendBulkTemplatedEmailCommand({
    /**
     * Each 'Destination' uses a corresponding set of replacement data. We can map each user
     * to a 'Destination' and provide user specific replacement data to create personalized emails.
     *
     * Here's an example of how a template would be replaced with user data:
     * Template: <h1>Hello {{name}},</h1><p>Don't forget about the party gifts!</p>
     * Destination 1: <h1>Hello Bilbo,</h1><p>Don't forget about the party gifts!</p>
     * Destination 2: <h1>Hello Frodo,</h1><p>Don't forget about the party gifts!</p>
     */
    Destinations: users.map((user) => ({
      Destination: { ToAddresses: [user.emailAddress] },
      ReplacementTemplateData: JSON.stringify({ name: user.firstName }),
    })),
    DefaultTemplateData: JSON.stringify({ name: "Shireling" }),
    Source: VERIFIED_EMAIL_1,
    Template: templateName,
  });
};

const run = async () => {
  const sendBulkTemplateEmailCommand = createBulkReminderEmailCommand(
    USERS,
    TEMPLATE_NAME,
  );
  try {
    return await sesClient.send(sendBulkTemplateEmailCommand);
  } catch (caught) {
    if (caught instanceof Error && caught.name === "MessageRejected") {
      /** @type { import('@aws-sdk/client-ses').MessageRejected} */
      const messageRejectedError = caught;
      return messageRejectedError;
    }
    throw caught;
  }
};
```

要运行示例，请在命令提示符中键入以下内容。电子邮件会排队，等待由 Amazon SES 发送。

```
node ses_sendbulktemplatedemail.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/ses/src/ses_sendbulktemplatedemail.js)示例代码 GitHub。

# Amazon Simple Notification Service 示例
<a name="sns-examples"></a>

Amazon Simple Notification Service (Amazon SNS) 是一项 Web 服务，用于协调和管理向订阅端点或客户端交付或发送消息的过程。

在 Amazon SNS 中有两种类型的客户端：发布者和订阅者，也称为生产者和消费者。

![\[JavaScript 环境、软件开发工具包和 Amazon SNS 之间的关系\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/code-samples-sns.png)


发布者通过创建消息并将消息发送至主题与订阅者进行异步交流，主题是一个逻辑访问点和通信渠道。订阅者（网络服务器、电子邮件地址、Amazon SQS 队列、 AWS Lambda 函数）在订阅主题时，通过支持的协议之一（Amazon SQS、HTTP/S、电子邮件 AWS Lambda、短信）使用或接收消息或通知。

Amazon SNS 的 JavaScript API 通过[类别：](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/SNS/)SNS 公开。

**Topics**
+ [

# 在 Amazon SNS 中管理主题
](sns-examples-managing-topics.md)
+ [

# 在 Amazon SNS 中发布消息
](sns-examples-publishing-messages.md)
+ [

# 在 Amazon SNS 中管理订阅
](sns-examples-subscribing-unsubscribing-topics.md)
+ [

# 使用 Amazon SNS 发送 SMS 消息
](sns-examples-sending-sms.md)

# 在 Amazon SNS 中管理主题
<a name="sns-examples-managing-topics"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 如何在 Amazon SNS 中创建可以将通知发布到的主题。
+ 如何删除在 Amazon SNS 中创建的主题。
+ 如何获取可用主题的列表。
+ 如何获取和设置主题属性。

## 情景
<a name="sns-examples-managing-topics-scenario"></a>

在本示例中，您使用一系列 Node.js 模块来创建、列出和删除 Amazon SNS 主题，以及处理主题属性。Node.js 模块使用的 SDK JavaScript ，通过`SNS`客户端类的以下方法来管理主题：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/CreateTopicCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/CreateTopicCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/ListTopicsCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/ListTopicsCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/DeleteTopicCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/DeleteTopicCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/GetTopicAttributesCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/GetTopicAttributesCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/SetTopicAttributesCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/SetTopicAttributesCommand/)

## 先决条件任务
<a name="sns-examples-managing-topics-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6 (ES6) 来 import/export 客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 创建主题
<a name="sns-examples-managing-topics-createtopic"></a>

在本示例中，使用 Node.js 模块创建 Amazon SNS 主题。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `create-topic.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建对象，将新主题的 `Name` 传递到 `SNS` 客户端类的 `CreateTopicCommand` 方法。要调用 `CreateTopicCommand` 方法，请创建一个用于调用 Amazon SNS 服务对象的异步函数并传递参数对象。返回的 `data` 包含主题的 ARN。

**注意**  
*TOPIC\$1NAME*替换为主题的名称。

```
import { CreateTopicCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} topicName - The name of the topic to create.
 */
export const createTopic = async (topicName = "TOPIC_NAME") => {
  const response = await snsClient.send(
    new CreateTopicCommand({ Name: topicName }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '087b8ad2-4593-50c4-a496-d7e90b82cf3e',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   TopicArn: 'arn:aws:sns:us-east-1:xxxxxxxxxxxx:TOPIC_NAME'
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node create-topic.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/create-topic.js)示例代码 GitHub。

## 列出主题
<a name="sns-examples-managing-topics-listtopics"></a>

在本示例中，使用 Node.js 模块列出所有 Amazon SNS 主题。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `list-topics.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建一个空对象以传递到 `SNS` 客户端类的 `ListTopicsCommand` 方法。要调用 `ListTopicsCommand` 方法，请创建一个用于调用 Amazon SNS 服务对象的异步函数并传递参数对象。`data`返回的内容包含您的主题 Amazon 资源名称 (ARNs) 的数组。

```
import { ListTopicsCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

export const listTopics = async () => {
  const response = await snsClient.send(new ListTopicsCommand({}));
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '936bc5ad-83ca-53c2-b0b7-9891167b909e',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   Topics: [ { TopicArn: 'arn:aws:sns:us-east-1:xxxxxxxxxxxx:mytopic' } ]
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node list-topics.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/list-topics.js)示例代码 GitHub。

## 删除主题
<a name="sns-examples-managing-topics-deletetopic"></a>

在本示例中，使用 Node.js 模块删除 Amazon SNS 主题。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `delete-topic.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建包含要删除的主题的 `TopicArn` 的对象，将其传递到 `SNS` 客户端类的 `DeleteTopicCommand` 方法。要调用 `DeleteTopicCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  
*TOPIC\$1ARN*替换为您要删除的主题的 Amazon 资源名称 (ARN)。

```
import { DeleteTopicCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} topicArn - The ARN of the topic to delete.
 */
export const deleteTopic = async (topicArn = "TOPIC_ARN") => {
  const response = await snsClient.send(
    new DeleteTopicCommand({ TopicArn: topicArn }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'a10e2886-5a8f-5114-af36-75bd39498332',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node delete-topic.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/delete-topic.js)示例代码 GitHub。

## 获取主题属性
<a name="sns-examples-managing-topicsgettopicattributes"></a>

在本示例中，使用 Node.js 模块检索 Amazon SNS 主题的属性。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `get-topic-attributes.js` 的 Node.js 模块。按前面所示配置 SDK。

创建包含要删除主题的 `TopicArn` 的对象，将其传递到 `SNS` 客户端类的 `GetTopicAttributesCommand` 方法。要调用 `GetTopicAttributesCommand` 方法，请调用一个 Amazon SNS 客户端服务对象来传递参数对象。

**注意**  
*TOPIC\$1ARN*替换为主题的 ARN。

```
import { GetTopicAttributesCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} topicArn - The ARN of the topic to retrieve attributes for.
 */
export const getTopicAttributes = async (topicArn = "TOPIC_ARN") => {
  const response = await snsClient.send(
    new GetTopicAttributesCommand({
      TopicArn: topicArn,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '36b6a24e-5473-5d4e-ac32-ff72d9a73d94',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   Attributes: {
  //     Policy: '{...}',
  //     Owner: 'xxxxxxxxxxxx',
  //     SubscriptionsPending: '1',
  //     TopicArn: 'arn:aws:sns:us-east-1:xxxxxxxxxxxx:mytopic',
  //     TracingConfig: 'PassThrough',
  //     EffectiveDeliveryPolicy: '{"http":{"defaultHealthyRetryPolicy":{"minDelayTarget":20,"maxDelayTarget":20,"numRetries":3,"numMaxDelayRetries":0,"numNoDelayRetries":0,"numMinDelayRetries":0,"backoffFunction":"linear"},"disableSubscriptionOverrides":false,"defaultRequestPolicy":{"headerContentType":"text/plain; charset=UTF-8"}}}',
  //     SubscriptionsConfirmed: '0',
  //     DisplayName: '',
  //     SubscriptionsDeleted: '1'
  //   }
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node get-topic-attributes.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/get-topic-attributes.js)示例代码 GitHub。

## 设置主题属性
<a name="sns-examples-managing-topicssttopicattributes"></a>

在本示例中，使用 Node.js 模块设置 Amazon SNS 主题的可变属性。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `set-topic-attributes.js` 的 Node.js 模块。按前面所示配置 SDK。

创建包含用于属性更新参数的对象，这包括要设置其属性的主题的 `TopicArn`、要设置的属性的名称以及该属性的新值。您只能设置 `Policy`、`DisplayName` 和 `DeliveryPolicy` 属性。将参数传递到 `SNS` 客户端类的 `SetTopicAttributesCommand` 方法。要调用 `SetTopicAttributesCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  
*ATTRIBUTE\$1NAME*替换为您正在设置的属性名称、*TOPIC\$1ARN*要设置其属性的主题的 Amazon 资源名称 (ARN) 以及该属*NEW\$1ATTRIBUTE\$1VALUE*性的新值。

```
import { SetTopicAttributesCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

export const setTopicAttributes = async (
  topicArn = "TOPIC_ARN",
  attributeName = "DisplayName",
  attributeValue = "Test Topic",
) => {
  const response = await snsClient.send(
    new SetTopicAttributesCommand({
      AttributeName: attributeName,
      AttributeValue: attributeValue,
      TopicArn: topicArn,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'd1b08d0e-e9a4-54c3-b8b1-d03238d2b935',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node set-topic-attributes.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/set-topic-attributes.js)示例代码 GitHub。

# 在 Amazon SNS 中发布消息
<a name="sns-examples-publishing-messages"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 如何将消息发布到 Amazon SNS 主题。

## 情景
<a name="sns-examples-publishing-messages-scenario"></a>

在本示例中，您使用一系列 Node.js 模块，将消息从 Amazon SNS 发布到主题端点、电子邮件或电话号码。Node.js 模块使用的 JavaScript SDK 通过`SNS`客户端类的以下方法发送消息：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/PublishCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/PublishCommand/)

## 先决条件任务
<a name="sns-examples-publishing-messages-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6 (ES6) 来 import/export 客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 将消息发布到 SNS 主题
<a name="sns-examples-publishing-text-messages"></a>

在本示例中，使用 Node.js 模块将消息发布到 Amazon SNS 主题。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

 创建文件名为 `publish-topic.js` 的 Node.js 模块。按前面所示配置 SDK。

创建一个对象，其中包含用于发布消息的参数，包括消息文本和亚马逊的亚马逊资源名称 (ARN)。 SNStopic有关可用短信属性的详细信息，请参阅[设置SMSAttributes](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SNS.html#setSMSAttributes-property)。

将参数传递到 `SNS` 客户端类的 `PublishCommand` 方法。创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  
*MESSAGE\$1TEXT*替换为消息文本和 *TOPIC\$1ARN* SNS 主题的 ARN。

```
import { PublishCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string | Record<string, any>} message - The message to send. Can be a plain string or an object
 *                                                 if you are using the `json` `MessageStructure`.
 * @param {string} topicArn - The ARN of the topic to which you would like to publish.
 */
export const publish = async (
  message = "Hello from SNS!",
  topicArn = "TOPIC_ARN",
) => {
  const response = await snsClient.send(
    new PublishCommand({
      Message: message,
      TopicArn: topicArn,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'e7f77526-e295-5325-9ee4-281a43ad1f05',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   MessageId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node publish-topic.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/publish-topic.js)示例代码 GitHub。

# 在 Amazon SNS 中管理订阅
<a name="sns-examples-subscribing-unsubscribing-topics"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 如何列出对 Amazon SNS 主题的所有订阅。
+ 如何将电子邮件地址、应用程序端点或 AWS Lambda 函数订阅到 Amazon SNS 主题。
+ 如何从 Amazon SNS 主题取消订阅。

## 情景
<a name="sns-examples-subscribing-unsubscribing-topics-scenario"></a>

在本示例中，您使用一系列 Node.js 模块将通知消息发布到 Amazon SNS 主题。Node.js 模块使用的 SDK JavaScript ，通过`SNS`客户端类的以下方法来管理主题：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/ListSubscriptionsByTopicCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/ListSubscriptionsByTopicCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/SubscribeCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/SubscribeCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/ConfirmSubscriptionCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/ConfirmSubscriptionCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/UnsubscribeCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/UnsubscribeCommand/)

## 先决条件任务
<a name="sns-examples-subscribing-unsubscribing-topics-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6 (ES6) 来 import/export 客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 列出对主题的订阅
<a name="sns-examples-list-subscriptions-email"></a>

在本示例中，使用 Node.js 模块以列出对 Amazon SNS 主题的所有订阅。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

 创建文件名为 `list-subscriptions-by-topic.js` 的 Node.js 模块。按前面所示配置 SDK。

创建一个对象，其中包含您要列出其订阅的主题的 `TopicArn` 参数。将参数传递到 `SNS` 客户端类的 `ListSubscriptionsByTopicCommand` 方法。要调用 `ListSubscriptionsByTopicCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  
*TOPIC\$1ARN*替换为您要列出其订阅的主题的 Amazon 资源名称 (ARN)。

```
import { ListSubscriptionsByTopicCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} topicArn - The ARN of the topic for which you wish to list subscriptions.
 */
export const listSubscriptionsByTopic = async (topicArn = "TOPIC_ARN") => {
  const response = await snsClient.send(
    new ListSubscriptionsByTopicCommand({ TopicArn: topicArn }),
  );

  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '0934fedf-0c4b-572e-9ed2-a3e38fadb0c8',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   Subscriptions: [
  //     {
  //       SubscriptionArn: 'PendingConfirmation',
  //       Owner: '901487484989',
  //       Protocol: 'email',
  //       Endpoint: 'corepyle@amazon.com',
  //       TopicArn: 'arn:aws:sns:us-east-1:901487484989:mytopic'
  //     }
  //   ]
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node list-subscriptions-by-topic.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/list-subscriptions-by-topic.js)示例代码 GitHub。

## 将电子邮件地址订阅到主题
<a name="sns-examples-subscribing-email"></a>

在本示例中，使用 Node.js 模块来订阅电子邮件地址，使其从 Amazon SNS 主题接收 SMTP 电子邮件。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `subscribe-email.js` 的 Node.js 模块。按前面所示配置 SDK。

创建包含 `Protocol` 参数的对象，用于指定 `email` 协议、要订阅到的主题的 `TopicArn` 以及作为邮件 `Endpoint` 的电子邮件地址。将参数传递到 `SNS` 客户端类的 `SubscribeCommand` 方法。您可以使用 `subscribe` 方法，根据在所传递参数中使用的值，将多种不同的端点订阅到某个 Amazon SNS 主题，如本主题中的其他示例所示。

要调用 `SubscribeCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  
*TOPIC\$1ARN*替换为主题的 Amazon 资源名称 (ARN)，并*EMAIL\$1ADDRESS*替换为要订阅的电子邮件地址。

```
import { SubscribeCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} topicArn - The ARN of the topic for which you wish to confirm a subscription.
 * @param {string} emailAddress - The email address that is subscribed to the topic.
 */
export const subscribeEmail = async (
  topicArn = "TOPIC_ARN",
  emailAddress = "usern@me.com",
) => {
  const response = await snsClient.send(
    new SubscribeCommand({
      Protocol: "email",
      TopicArn: topicArn,
      Endpoint: emailAddress,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'c8e35bcd-b3c0-5940-9f66-06f6fcc108f0',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   SubscriptionArn: 'pending confirmation'
  // }
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node subscribe-email.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/subscribe-email.js)示例代码 GitHub。

### 确认订阅
<a name="sns-confirm-subscription-email"></a>

在本示例中，使用 Node.js 模块，通过验证之前的 SUBSCRIBE 操作发送到端点的令牌来验证端点所有者接收消息的意图。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `confirm-subscription.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

定义参数，包括 `TOPIC_ARN` 和 `TOKEN`，然后为 `AuthenticateOnUnsubscribe` 定义值 `TRUE` 或 `FALSE`。

令牌是在之前的 `SUBSCRIBE` 操作中发送给端点所有者的短期令牌。例如，对于电子邮件端点，`TOKEN` 可在发送给电子邮件所有者的确认订阅电子邮件的 URL 中找到。例如，在以下 URL 中，`abc123` 是令牌。

![\[Amazon Web Services Simple Notification Service subscription confirmation page.\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/token.png)


要调用 `ConfirmSubscriptionCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  
将主题的 *TOPIC\$1ARN* Amazon 资源名称 (ARN) 替换为之前`Subscribe`操作中发送给终端节点所有者的 URL 中的令牌值，然后定义*AuthenticateOnUnsubscribe*. 的`TRUE`值为或。*TOKEN* `FALSE`

```
import { ConfirmSubscriptionCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} token - This token is sent the subscriber. Only subscribers
 *                         that are not AWS services (HTTP/S, email) need to be confirmed.
 * @param {string} topicArn - The ARN of the topic for which you wish to confirm a subscription.
 */
export const confirmSubscription = async (
  token = "TOKEN",
  topicArn = "TOPIC_ARN",
) => {
  const response = await snsClient.send(
    // A subscription only needs to be confirmed if the endpoint type is
    // HTTP/S, email, or in another AWS account.
    new ConfirmSubscriptionCommand({
      Token: token,
      TopicArn: topicArn,
      // If this is true, the subscriber cannot unsubscribe while unauthenticated.
      AuthenticateOnUnsubscribe: "false",
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '4bb5bce9-805a-5517-8333-e1d2cface90b',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   SubscriptionArn: 'arn:aws:sns:us-east-1:xxxxxxxxxxxx:TOPIC_NAME:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node confirm-subscription.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/confirm-subscription.js)示例代码 GitHub。

## 将应用程序端点订阅到主题
<a name="sns-examples-subscribing-apps"></a>

在本示例中，使用 Node.js 模块来订阅移动应用程序端点，使其从 Amazon SNS 主题接收通知。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `subscribe-app.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的模块和软件包。

创建一个包含 `Protocol` 参数的对象，用于指定 `application` 协议、要订阅到的主题的 `TopicArn` 以及 `Endpoint` 参数的移动应用程序端点的 Amazon 资源名称 (ARN)。将参数传递到 `SNS` 客户端类的 `SubscribeCommand` 方法。

要调用 `SubscribeCommand` 方法，请创建一个用于调用 Amazon SNS 服务对象的异步函数并传递参数对象。

**注意**  
*TOPIC\$1ARN*替换为主题的 Amazon 资源名称 (ARN)，以及*MOBILE\$1ENDPOINT\$1ARN*您订阅该主题的终端节点。

```
import { SubscribeCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} topicArn - The ARN of the topic the subscriber is subscribing to.
 * @param {string} endpoint - The Endpoint ARN of an application. This endpoint is created
 *                            when an application registers for notifications.
 */
export const subscribeApp = async (
  topicArn = "TOPIC_ARN",
  endpoint = "ENDPOINT",
) => {
  const response = await snsClient.send(
    new SubscribeCommand({
      Protocol: "application",
      TopicArn: topicArn,
      Endpoint: endpoint,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'c8e35bcd-b3c0-5940-9f66-06f6fcc108f0',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   SubscriptionArn: 'pending confirmation'
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node subscribe-app.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/subscribe-app.js)示例代码 GitHub。

## 将 Lambda 函数订阅到主题
<a name="sns-examples-subscribing-lambda"></a>

在此示例中，使用 Node.js 模块订阅 AWS Lambda 函数，使其接收来自亚马逊 SNS 主题的通知。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `subscribe-lambda.js` 的 Node.js 模块。按前面所示配置 SDK。

创建包含`Protocol`参数的对象，指定`lambda`协议、要订阅`TopicArn`的主题以及 AWS Lambda 函数的 Amazon 资源名称 (ARN) 作为参数。`Endpoint`将参数传递到 `SNS` 客户端类的 `SubscribeCommand` 方法。

要调用 `SubscribeCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  
*TOPIC\$1ARN*替换为主题的亚马逊资源名称 (ARN)，并*LAMBDA\$1FUNCTION\$1ARN*替换为 Lambda 函数的亚马逊资源名称 (ARN)。

```
import { SubscribeCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} topicArn - The ARN of the topic the subscriber is subscribing to.
 * @param {string} endpoint - The Endpoint ARN of and AWS Lambda function.
 */
export const subscribeLambda = async (
  topicArn = "TOPIC_ARN",
  endpoint = "ENDPOINT",
) => {
  const response = await snsClient.send(
    new SubscribeCommand({
      Protocol: "lambda",
      TopicArn: topicArn,
      Endpoint: endpoint,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'c8e35bcd-b3c0-5940-9f66-06f6fcc108f0',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   SubscriptionArn: 'pending confirmation'
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node subscribe-lambda.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/subscribe-lambda.js)示例代码 GitHub。

## 从主题取消订阅
<a name="sns-examples-unsubscribing"></a>

在本示例中，使用 Node.js 模块取消订阅 Amazon SNS 主题订阅。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `unsubscribe.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。

创建一个包含 `SubscriptionArn` 参数的对象，指定要取消订阅的订阅的 Amazon 资源名称 (ARN)。将参数传递到 `SNS` 客户端类的 `UnsubscribeCommand` 方法。

要调用 `UnsubscribeCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  
*TOPIC\$1SUBSCRIPTION\$1ARN*替换为订阅的 Amazon 资源名称 (ARN) 即可取消订阅。

```
import { UnsubscribeCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string} subscriptionArn - The ARN of the subscription to cancel.
 */
const unsubscribe = async (
  subscriptionArn = "arn:aws:sns:us-east-1:xxxxxxxxxxxx:mytopic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
) => {
  const response = await snsClient.send(
    new UnsubscribeCommand({
      SubscriptionArn: subscriptionArn,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '0178259a-9204-507c-b620-78a7570a44c6',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node unsubscribe.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/unsubscribe.js)示例代码 GitHub。

# 使用 Amazon SNS 发送 SMS 消息
<a name="sns-examples-sending-sms"></a>

![\[JavaScript code example that applies to Node.js execution\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/nodeicon.png)

**此 Node.js 代码示例演示：**
+ 如何获取和设置 Amazon SNS 的 SMS 消息发送首选项。
+ 如何检查电话号码以确定是否选择退出接收 SMS 消息。
+ 如何获取已选择退出接收 SMS 消息的电话号码列表。
+ 如何发送 SMS 消息。

## 情景
<a name="sns-examples-sending-sms-scenario"></a>

您可以使用 Amazon SNS 将文本消息或 SMS 消息发送到支持 SMS 的设备上。您可以直接向电话号码发送消息，也可以使用多个电话号码订阅主题，然后通过向该主题发送消息来一次向这些电话号码发送消息。

在本示例中，您使用一系列 Node.js 模块将 SMS 文本消息从 Amazon SNS 发送到支持 SMS 的设备。Node.js 模块使用的 SDK 使用以下`SNS`客户端类的方法发布 SMS 消息： JavaScript 
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/GetSMSAttributesCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/GetSMSAttributesCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/SetSMSAttributesCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/SetSMSAttributesCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/CheckIfPhoneNumberIsOptedOutCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/CheckIfPhoneNumberIsOptedOutCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/ListPhoneNumbersOptedOutCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/ListPhoneNumbersOptedOutCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/PublishCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-sns/Class/PublishCommand/)

## 先决条件任务
<a name="sns-examples-sending-sms-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6 (ES6) 来 import/export 客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 获取 SMS 属性
<a name="sending-sms-getattributes"></a>

使用 Amazon SNS 来指定发送 SMS 消息的首选项，例如如何优化消息传输（在成本或可靠传输方面）、您的每月支出限额、如何记录消息传输以及是否要订阅每日 SMS 使用率报告。这些首选项通过检索得到，并设置为 Amazon SNS 的 SMS 属性。

在本示例中，使用 Node.js 模块获取 Amazon SNS 中的当前 SMS 属性。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

 创建文件名为 `get-sms-attributes.js` 的 Node.js 模块。

如前所示配置 SDK，包括下载所需的客户端和软件包。创建包含用于获取 SMS 属性的参数的对象，包括要获取的单个属性的名称。有关可用短信属性的详细信息，请参阅《亚马逊简单通知服务 API 参考》SMSAttributes中的 “[设置](https://docs.aws.amazon.com/sns/latest/api/API_SetSMSAttributes.html)”。

此示例获取 `DefaultSMSType` 属性，该属性控制 SMS 消息是作为 `Promotional` 发送（这将优化消息传送以尽可能降低成本）还是作为 `Transactional` 发送（这将优化消息传送以实现最高的可靠性）。将参数传递到 `SNS` 客户端类的 `SetTopicAttributesCommand` 方法。要调用 `SetSMSAttributesCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  
*ATTRIBUTE\$1NAME*替换为属性的名称。

```
import { GetSMSAttributesCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

export const getSmsAttributes = async () => {
  const response = await snsClient.send(
    // If you have not modified the account-level mobile settings of SNS,
    // the DefaultSMSType is undefined. For this example, it was set to
    // Transactional.
    new GetSMSAttributesCommand({ attributes: ["DefaultSMSType"] }),
  );

  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '67ad8386-4169-58f1-bdb9-debd281d48d5',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   attributes: { DefaultSMSType: 'Transactional' }
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node get-sms-attributes.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/get-sms-attributes.js)示例代码 GitHub。

## 设置 SMS 属性
<a name="sending-sms-setattributes"></a>

在本示例中，使用 Node.js 模块获取 Amazon SNS 中的当前 SMS 属性。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

 创建文件名为 `set-sms-attribute-type.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。创建包含用于设置 SMS 属性的参数的对象，其中包括要设置的单个属性的名称以及为各个属性设置的值。有关可用短信属性的详细信息，请参阅《亚马逊简单通知服务 API 参考》SMSAttributes中的 “[设置](https://docs.aws.amazon.com/sns/latest/api/API_SetSMSAttributes.html)”。

此示例将 `DefaultSMSType` 属性设置为 `Transactional`，这会优化消息传送以实现最高的可靠性。将参数传递到 `SNS` 客户端类的 `SetTopicAttributesCommand` 方法。要调用 `SetSMSAttributesCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

```
import { SetSMSAttributesCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {"Transactional" | "Promotional"} defaultSmsType
 */
export const setSmsType = async (defaultSmsType = "Transactional") => {
  const response = await snsClient.send(
    new SetSMSAttributesCommand({
      attributes: {
        // Promotional – (Default) Noncritical messages, such as marketing messages.
        // Transactional – Critical messages that support customer transactions,
        // such as one-time passcodes for multi-factor authentication.
        DefaultSMSType: defaultSmsType,
      },
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '1885b977-2d7e-535e-8214-e44be727e265',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node set-sms-attribute-type.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/set-sms-attribute-type.js)示例代码 GitHub。

## 检查电话号码是否已选择不接收消息
<a name="sending-sms-checkifphonenumberisoptedout"></a>

在本示例中，使用 Node.js 模块检查电话号码，确定该号码是否已退出接收 SMS 消息。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `check-if-phone-number-is-opted-out.js` 的 Node.js 模块。按前面所示配置 SDK。创建一个对象，其中将要检查的电话号码包含作为参数。

此示例设置 `PhoneNumber` 参数以指定要检查的电话号码。将对象发布到 `SNS` 客户端类的 `CheckIfPhoneNumberIsOptedOutCommand` 方法。要调用 `CheckIfPhoneNumberIsOptedOutCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

**注意**  

*PHONE\$1NUMBER*替换为电话号码。

```
import { CheckIfPhoneNumberIsOptedOutCommand } from "@aws-sdk/client-sns";

import { snsClient } from "../libs/snsClient.js";

export const checkIfPhoneNumberIsOptedOut = async (
  phoneNumber = "5555555555",
) => {
  const command = new CheckIfPhoneNumberIsOptedOutCommand({
    phoneNumber,
  });

  const response = await snsClient.send(command);
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '3341c28a-cdc8-5b39-a3ee-9fb0ee125732',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   isOptedOut: false
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node check-if-phone-number-is-opted-out.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/check-if-phone-number-is-opted-out.js)示例代码 GitHub。

## 列出已退出的电话号码
<a name="sending-sms-listphonenumbersoptedout"></a>

在本示例中，使用 Node.js 模块获取已退出接收 SMS 消息的电话号码列表。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `list-phone-numbers-opted-out.js` 的 Node.js 模块。按前面所示配置 SDK。创建一个空对象作为参数。

将对象发布到 `SNS` 客户端类的 `ListPhoneNumbersOptedOutCommand` 方法。要调用 `ListPhoneNumbersOptedOutCommand`方法，请创建一个异步函数，调用 Amazon SNS 客户端服务对象并传递参数对象。

```
import { ListPhoneNumbersOptedOutCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

export const listPhoneNumbersOptedOut = async () => {
  const response = await snsClient.send(
    new ListPhoneNumbersOptedOutCommand({}),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '44ff72fd-1037-5042-ad96-2fc16601df42',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   phoneNumbers: ['+15555550100']
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node list-phone-numbers-opted-out.js 
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/list-phone-numbers-opted-out.js)示例代码 GitHub。

## 发布 SMS 消息
<a name="sending-sms-publishsms"></a>

在本示例中，使用 Node.js 模块将 SMS 消息发布到电话号码。

创建一个 `libs` 目录，然后使用文件名 `snsClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon SNS 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/libs/snsClient.js)示例代码 GitHub。

创建文件名为 `publish-sms.js` 的 Node.js 模块。如前所示配置 SDK，包括安装所需的客户端和软件包。创建一个包含 `Message` 和 `PhoneNumber` 参数的对象。

在发送 SMS 消息时，请使用 E.164 格式指定电话号码。E.164 是用于国际电信的电话号码结构标准。遵循此格式的电话号码最多可包含 15 位，并以加号 (\$1) 和国家/地区代码作为前缀。例如，E.164 格式的美国电话号码将显示为 \$1 XXX5550100 1001。

此示例设置 `PhoneNumber` 参数以指定将消息发送到的电话号码。将对象发布到 `SNS` 客户端类的 `PublishCommand` 方法。要调用 `PublishCommand` 方法，请创建一个用于调用 Amazon SNS 服务对象的异步函数并传递参数对象。

**注意**  
*TEXT\$1MESSAGE*替换为*PHONE\$1NUMBER*短信和电话号码。

```
import { PublishCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

/**
 * @param {string | Record<string, any>} message - The message to send. Can be a plain string or an object
 *                                                 if you are using the `json` `MessageStructure`.
 * @param {*} phoneNumber - The phone number to send the message to.
 */
export const publish = async (
  message = "Hello from SNS!",
  phoneNumber = "+15555555555",
) => {
  const response = await snsClient.send(
    new PublishCommand({
      Message: message,
      // One of PhoneNumber, TopicArn, or TargetArn must be specified.
      PhoneNumber: phoneNumber,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: '7410094f-efc7-5f52-af03-54737569ab77',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   },
  //   MessageId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
  // }
  return response;
};
```

要运行示例，请在命令提示符中键入以下内容。

```
node publish-sms.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/sns/actions/publish-sms.js)示例代码 GitHub。

# Amazon Transcribe 示例
<a name="Transcribe-examples"></a>

Amazon Transcribe 使开发人员能够轻松地向其应用程序添加语音到文本转换功能。

![\[JavaScript 环境、软件开发工具包和 Amazon Transcribe 之间的关系\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/code-samples-transcribe.png)


Amazon Transcribe 的 JavaScript API 通过[TranscribeService](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/Transcribe/)客户端类公开。

**Topics**
+ [

# Amazon Transcribe 示例
](transcribe-examples-section.md)
+ [

# Amazon Transcribe Medical 示例
](transcribe-medical-examples-section.md)

# Amazon Transcribe 示例
<a name="transcribe-examples-section"></a>

在此示例中，使用一系列 Node.js 模块通过 `TranscribeService` 客户端类的以下方法创建、列出和删除转录作业：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/StartTranscriptionJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/StartTranscriptionJobCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/ListTranscriptionJobsCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/ListTranscriptionJobsCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/DeleteTranscriptionJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/DeleteTranscriptionJobCommand/)

有关 Amazon Transcribe 的更多信息，请参阅 [Amazon Transcribe 开发人员指南](https://docs.aws.amazon.com//transcribe/latest/dg/what-is-transcribe.html)。

## 先决条件任务
<a name="transcribe-example-transcription-jobs"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6 (ES6) 来 import/export 客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)

## 启动 Amazon Transcribe 作业
<a name="transcribe-start-transcription"></a>

此示例演示如何使用 适用于 JavaScript 的 AWS SDK启动 Amazon Transcribe 转录作业。有关更多信息，请参阅 [StartTranscriptionJobCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/StartTranscriptionJobCommand/)。

创建一个 `libs` 目录，然后使用文件名 `transcribeClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Transcribe 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { TranscribeClient } from "@aws-sdk/client-transcribe";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create an Amazon Transcribe service client object.
const transcribeClient = new TranscribeClient({ region: REGION });
export { transcribeClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/libs/transcribeClient.js)示例代码 GitHub。

创建文件名为 `transcribe-create-job.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。创建一个参数对象，指定所需的参数。使用 `StartMedicalTranscriptionJobCommand` 命令启动作业。

**注意**  
*MEDICAL\$1JOB\$1NAME*替换为转录作业的名称。为此，*OUTPUT\$1BUCKET\$1NAME*请指定保存输出的 Amazon S3 存储桶。用于*JOB\$1TYPE*指定作业类型。用于*SOURCE\$1LOCATION*指定源文件的位置。用于*SOURCE\$1FILE\$1LOCATION*指定输入媒体文件的位置。

```
// Import the required AWS SDK clients and commands for Node.js
import { StartTranscriptionJobCommand } from "@aws-sdk/client-transcribe";
import { transcribeClient } from "./libs/transcribeClient.js";

// Set the parameters
export const params = {
  TranscriptionJobName: "JOB_NAME",
  LanguageCode: "LANGUAGE_CODE", // For example, 'en-US'
  MediaFormat: "SOURCE_FILE_FORMAT", // For example, 'wav'
  Media: {
    MediaFileUri: "SOURCE_LOCATION",
    // For example, "https://transcribe-demo.s3-REGION.amazonaws.com/hello_world.wav"
  },
  OutputBucketName: "OUTPUT_BUCKET_NAME",
};

export const run = async () => {
  try {
    const data = await transcribeClient.send(
      new StartTranscriptionJobCommand(params),
    );
    console.log("Success - put", data);
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node transcribe-create-job.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/transcribe_create_job.js)示例代码 GitHub。

## 列出 Amazon Transcribe 作业
<a name="transcribe-list-jobs"></a>

此示例演示如何使用 适用于 JavaScript 的 AWS SDK列出 Amazon Transcribe 转录作业。有关您可以修改的其他设置的更多信息，请参阅 [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/ListTranscriptionJobsCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/ListTranscriptionJobsCommand/)。

创建一个 `libs` 目录，然后使用文件名 `transcribeClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Transcribe 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { TranscribeClient } from "@aws-sdk/client-transcribe";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create an Amazon Transcribe service client object.
const transcribeClient = new TranscribeClient({ region: REGION });
export { transcribeClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/libs/transcribeClient.js)示例代码 GitHub。

创建文件名为 `transcribe-list-jobs.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。使用所需参数创建参数对象。

**注意**  
*KEY\$1WORD*替换为返回的作业名称必须包含的关键字。

```
// Import the required AWS SDK clients and commands for Node.js

import { ListTranscriptionJobsCommand } from "@aws-sdk/client-transcribe";
import { transcribeClient } from "./libs/transcribeClient.js";

// Set the parameters
export const params = {
  JobNameContains: "KEYWORD", // Not required. Returns only transcription
  // job names containing this string
};

export const run = async () => {
  try {
    const data = await transcribeClient.send(
      new ListTranscriptionJobsCommand(params),
    );
    console.log("Success", data.TranscriptionJobSummaries);
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node transcribe-list-jobs.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/transcribe_list_jobs.js)示例代码 GitHub。

## 删除 Amazon Transcribe 作业
<a name="transcribe-delete-job"></a>

此示例演示如何使用 适用于 JavaScript 的 AWS SDK删除 Amazon Transcribe 转录作业。有关选项的更多信息，请参阅 [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/DeleteTranscriptionJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/DeleteTranscriptionJobCommand/)。

创建一个 `libs` 目录，然后使用文件名 `transcribeClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Transcribe 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import  { TranscribeClient }  from  "@aws-sdk/client-transcribe";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create Transcribe service object.
const transcribeClient = new TranscribeClient({ region: REGION });
export { transcribeClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/libs/transcribeClient.js)示例代码 GitHub。

创建文件名为 `transcribe-delete-job.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。指定 AWS 区域以及要删除的任务的名称。

**注意**  
*JOB\$1NAME*替换为要删除的作业的名称。

```
// Import the required AWS SDK clients and commands for Node.js
import { DeleteTranscriptionJobCommand } from "@aws-sdk/client-transcribe";
import { transcribeClient } from "./libs/transcribeClient.js";

// Set the parameters
export const params = {
  TranscriptionJobName: "JOB_NAME", // Required. For example, 'transciption_demo'
};

export const run = async () => {
  try {
    const data = await transcribeClient.send(
      new DeleteTranscriptionJobCommand(params),
    );
    console.log("Success - deleted");
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node transcribe-delete-job.js  
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/transcribe_delete_job.js)示例代码 GitHub。

# Amazon Transcribe Medical 示例
<a name="transcribe-medical-examples-section"></a>

在此示例中，使用一系列 Node.js 模块通过 `TranscribeService` 客户端类的以下方法创建、列出和删除医疗转录作业：
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/StartMedicalTranscriptionJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/StartMedicalTranscriptionJobCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/ListTranscriptionJobsCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/ListTranscriptionJobsCommand/)
+ [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/DeleteTranscriptionJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/DeleteTranscriptionJobCommand/)

有关 Amazon Transcribe 的更多信息，请参阅 [Amazon Transcribe 开发人员指南](https://docs.aws.amazon.com//transcribe/latest/dg/what-is-transcribe.html)。

## 先决条件任务
<a name="transcribe-example-transcription-medical-jobs"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
这些示例演示了如何使用 ECMAScript6 (ES6) 来 import/export 客户端服务对象和命令。  
这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。
如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)

## 启动 Amazon Transcribe Medical 转录作业
<a name="transcribe-start-medical-transcription"></a>

此示例演示如何使用 适用于 JavaScript 的 AWS SDK启动 Amazon Transcribe Medical 转录作业。有关更多信息，请参阅 [startMedicalTranscriptionJob](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/StartMedicalTranscriptionJobCommand/)。

创建一个 `libs` 目录，然后使用文件名 `transcribeClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Transcribe 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import  { TranscribeClient }  from  "@aws-sdk/client-transcribe";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create Transcribe service object.
const transcribeClient = new TranscribeClient({ region: REGION });
export { transcribeClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/libs/transcribeClient.js)示例代码 GitHub。

创建文件名为 `transcribe-create-medical-job.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。创建一个参数对象，指定所需的参数。使用 `StartMedicalTranscriptionJobCommand` 命令启动医疗作业。

**注意**  
*MEDICAL\$1JOB\$1NAME*替换为医疗转录作业的名称。为此，*OUTPUT\$1BUCKET\$1NAME*请指定保存输出的 Amazon S3 存储桶。用于*JOB\$1TYPE*指定作业类型。用于*SOURCE\$1LOCATION*指定源文件的位置。用于*SOURCE\$1FILE\$1LOCATION*指定输入媒体文件的位置。

```
// Import the required AWS SDK clients and commands for Node.js
import { StartMedicalTranscriptionJobCommand } from "@aws-sdk/client-transcribe";
import { transcribeClient } from "./libs/transcribeClient.js";

// Set the parameters
export const params = {
  MedicalTranscriptionJobName: "MEDICAL_JOB_NAME", // Required
  OutputBucketName: "OUTPUT_BUCKET_NAME", // Required
  Specialty: "PRIMARYCARE", // Required. Possible values are 'PRIMARYCARE'
  Type: "JOB_TYPE", // Required. Possible values are 'CONVERSATION' and 'DICTATION'
  LanguageCode: "LANGUAGE_CODE", // For example, 'en-US'
  MediaFormat: "SOURCE_FILE_FORMAT", // For example, 'wav'
  Media: {
    MediaFileUri: "SOURCE_FILE_LOCATION",
    // The S3 object location of the input media file. The URI must be in the same region
    // as the API endpoint that you are calling.For example,
    // "https://transcribe-demo.s3-REGION.amazonaws.com/hello_world.wav"
  },
};

export const run = async () => {
  try {
    const data = await transcribeClient.send(
      new StartMedicalTranscriptionJobCommand(params),
    );
    console.log("Success - put", data);
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node transcribe-create-medical-job.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/transcribe_create_medical_job.js)示例代码 GitHub。

## 列出 Amazon Transcribe Medical 作业
<a name="transcribe-list-medical-jobs"></a>

此示例演示如何使用 适用于 JavaScript 的 AWS SDK列出 Amazon Transcribe 转录作业。有关更多信息，请参阅 [ListTranscriptionMedicalJobsCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/ListMedicalTranscriptionJobsCommand/)。

创建一个 `libs` 目录，然后使用文件名 `transcribeClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Transcribe 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import { TranscribeClient } from "@aws-sdk/client-transcribe";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create an Amazon Transcribe service client object.
const transcribeClient = new TranscribeClient({ region: REGION });
export { transcribeClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/libs/transcribeClient.js)示例代码 GitHub。

创建文件名为 `transcribe-list-medical-jobs.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。使用所需参数创建参数对象，并使用 `ListMedicalTranscriptionJobsCommand` 命令列出医疗作业。

**注意**  
*KEYWORD*替换为返回的作业名称必须包含的关键字。

```
// Import the required AWS SDK clients and commands for Node.js

import { ListMedicalTranscriptionJobsCommand } from "@aws-sdk/client-transcribe";
import { transcribeClient } from "./libs/transcribeClient.js";

// Set the parameters
export const params = {
  JobNameContains: "KEYWORD", // Returns only transcription job names containing this string
};

export const run = async () => {
  try {
    const data = await transcribeClient.send(
      new ListMedicalTranscriptionJobsCommand(params),
    );
    console.log("Success", data.MedicalTranscriptionJobName);
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node transcribe-list-medical-jobs.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/transcribe_list_medical_jobs.js)示例代码 GitHub。

## 删除 Amazon Transcribe Medical 作业
<a name="transcribe-delete-medical-job"></a>

此示例演示如何使用 适用于 JavaScript 的 AWS SDK删除 Amazon Transcribe 转录作业。有关选项的更多信息，请参阅 [https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/DeleteMedicalTranscriptionJobCommand/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-transcribe/Class/DeleteMedicalTranscriptionJobCommand/)。

创建一个 `libs` 目录，然后使用文件名 `transcribeClient.js` 创建一个 Node.js 模块。将以下代码复制并粘贴到其中，这将创建 Amazon Transcribe 客户端对象。*REGION*替换为您所在 AWS 的地区。

```
import  { TranscribeClient }  from  "@aws-sdk/client-transcribe";
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create Transcribe service object.
const transcribeClient = new TranscribeClient({ region: REGION });
export { transcribeClient };
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/libs/transcribeClient.js)示例代码 GitHub。

创建文件名为 `transcribe-delete-job.js` 的 Node.js 模块。确保如前所示配置 SDK，包括安装所需的客户端和软件包。使用所需参数创建参数对象，并使用 `DeleteMedicalJobCommand` 命令删除医疗作业。

**注意**  
*JOB\$1NAME*替换为要删除的作业的名称。

```
// Import the required AWS SDK clients and commands for Node.js
import { DeleteMedicalTranscriptionJobCommand } from "@aws-sdk/client-transcribe";
import { transcribeClient } from "./libs/transcribeClient.js";

// Set the parameters
export const params = {
  MedicalTranscriptionJobName: "MEDICAL_JOB_NAME", // For example, 'medical_transciption_demo'
};

export const run = async () => {
  try {
    const data = await transcribeClient.send(
      new DeleteMedicalTranscriptionJobCommand(params),
    );
    console.log("Success - deleted");
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

要运行示例，请在命令提示符中键入以下内容。

```
node transcribe-delete-medical-job.js
```

可以在此[处找到此](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/transcribe/src/transcribe_delete_medical_job.js)示例代码 GitHub。

# 在 Amazon EC2 实例上设置 Node.js
<a name="setting-up-node-on-ec2-instance"></a>

将 Node.js 与软件开发工具包配合使用的常见场景 JavaScript 是在亚马逊弹性计算云 (Amazon EC2) 实例上设置和运行 Node.js Web 应用程序。在本教程中，您将创建一个 Linux 实例，使用 SSH 连接到该实例，然后安装 Node.js 以在该实例上运行。

## 先决条件
<a name="setting-up-node-on-ec2-instance.prerequisites"></a>

本教程假定您已经使用公有 DNS 名称启动 Linux 实例，该实例可从 Internet 访问并且您可以使用 SSH 来连接。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[步骤 1：启动实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-launch-instance)。

**重要**  
在启动新的 Amazon EC2 实例时，请使用 **Amazon Linux 2023** Amazon 机器映像 (AMI)。

还必须将安全组配置为允许 `SSH`（端口 22）、` HTTP`（端口 80）和 `HTTPS`（端口 443）连接。有关这些先决条件的更多信息，请参阅《Amazon EC2 用户指南》**中的[设置 Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/get-set-up-for-amazon-ec2.html)。

## 过程
<a name="setting-up-node-on-ec2-instance-procedure"></a>

以下过程可帮助您在 Amazon Linux 实例上安装 Node.js。您可以使用此服务器来托管 Node.js Web 应用程序。

**在 Linux 实例上设置 Node.js**

1. 使用 SSH 以 `ec2-user` 身份连接您的 Linux 实例。

1. 通过在命令行中键入以下内容，安装节点版本管理器 (`nvm`)。
**警告**  
AWS 不控制以下代码。在运行之前，请务必验证其真实性和完整性。有关此代码的更多信息可以在 [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md) GitHub 存储库中找到。

   ```
   curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
   ```

   由于 `nvm` 可以安装多个版本的 Node.js 并允许您在各个版本之间切换，我们将使用 `nvm` 安装 Node.js。

1. 通过在命令行中键入以下内容来加载 `nvm`。

   ```
   source ~/.bashrc
   ```

1. 通过在命令行键入以下命令，使用 nvm 安装 Node.js 的最新 LTS 版本。

   ```
   nvm install --lts
   ```

   安装 Node.js 还会安装节点程序包管理器 (`npm`)，以便您根据需要安装其它模块。

1. 通过在命令行键入以下内容，测试 Node.js 已安装并正确运行。

   ```
   node -e "console.log('Running Node.js ' + process.version)"
   ```

   这将显示以下消息，其中显示正在运行的 Node.js 的版本。

    `Running Node.js VERSION` 

**注意**  
节点安装仅适用于当前的 Amazon EC2 会话。如果您重启 CLI 会话，则需要再次使用 nvm 来启用已安装的节点版本。如果实例终止，则需要重新安装节点。另一种方法是在获得要保留的配置后，制作一个 Amazon EC2 实例的 Amazon 机器映像 (AMI)，如以下主题所述。

## 创建 Amazon 机器映像 (AMI)
<a name="setting-up-node-on-ec2-instance-create-image"></a>

在 Amazon EC2 实例上安装 Node.js 后，您可以从该实例创建 Amazon 机器映像 (AMI)。创建 AMI 可通过同一个 Node.js 安装，轻松地预置多个 Amazon EC2 实例。有关从现有实例创建 AMI 的更多信息，请参阅《Amazon EC2 用户指南》**中的[创建一个由 Amazon EBS 支持的 Linux AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html)。

## 相关资源
<a name="setting-up-node-on-ec2-instance-related-resource"></a>

有关本主题中使用的命令和软件的更多信息，请参阅以下网页：
+ 节点版本管理器 (`nvm`)-参见 [nvm 存储库](https://github.com/creationix/nvm)。 GitHub
+ 节点程序包管理器 (`npm`)：请参阅 [npm 网站](https://www.npmjs.com)。

# 使用 API Gateway 调用 Lambda
<a name="api-gateway-invoking-lambda-example"></a>

您可以使用 Amazon API Gateway 调用 Lambda 函数，该 AWS 服务用于大规模创建、发布、维护、监控和保护 REST、HTTP。 WebSocket APIs API 开发人员可以创建 APIs 该访问权限 AWS 或其他网络服务，以及存储在 AWS 云端的数据。作为 API Gateway 开发者，您可以创建 APIs 用于自己的客户端应用程序。有关更多信息，请参阅[什么是 Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)。

AWS Lambda 是一项计算服务，使您无需预置或管理服务器即可运行代码。您可以使用各种编程语言创建 Lambda 函数。有关的更多信息 AWS Lambda，请参阅[什么是 AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)。

在此示例中，您将使用 Lambda 运行时 API 创建一个 Lambda 函数。 JavaScript 此示例调用不同的 AWS 服务来执行特定的用例。例如，假设组织在员工入职一周年纪念日时向员工发送移动短信表示祝贺，如下图所示。

![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picPhone.png)


完成此示例大约需要 20 分钟。

此示例向您展示如何使用 JavaScript 逻辑来创建执行此用例的解决方案。例如，您将学习如何使用 Lambda 函数读取数据库以确定哪些员工已达到入职一周年纪念日、如何处理数据以及如何发送短信。然后，您将学习如何使用 API Gateway 通过 Rest 端点调用此 AWS Lambda 函数。例如，您可以使用以下 curl 命令调用 Lambda 函数：

```
curl -XGET "https://xxxxqjko1o3.execute-api.us-east-1.amazonaws.com/cronstage/employee" 
```

本 AWS 教程使用名为 Employee 的 Amazon DynamoDB 表，其中包含这些字段。
+ **id** - 表的主键。
+ **firstName** - 员工的名字。
+ **phone** - 员工的电话号码。
+ **startDate** - 员工的入职日期。

![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/pic00.png)


**重要**  
完成费用：本文档中包含的 AWS 服务包含在 AWS 免费套餐中。但是，请务必在完成此示例后终止所有资源，以确保系统不会向您收费。

**构建应用程序：**

1. [满足先决条件](#api-gateway-invoking-lambda-provision-resources)

1. [创建 AWS 资源](#api-gateway-invoking-lambda-provision-resources)

1. [准备浏览器脚本](#api-gateway-invoking-lambda-browser-script)

1. [创建并上传 Lambda 函数](#api-gateway-invoking-lambda-browser-script)

1. [部署 Lambda 函数](#api-gateway-invoking-lambda-deploy-function)

1. [运行应用程序](#api-gateway-invoking-lambda-run)

1. [删除资源](#api-gateway-invoking-lambda-destroy)

## 完成先决条件任务
<a name="api-gateway-invoking-lambda-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cross-services/lambda-api-gateway/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

## 创建 AWS 资源
<a name="api-gateway-invoking-lambda-provision-resources"></a>

本教程要求具有以下资源:
+ 一个名为 `Employee` 的 Amazon DynamoDB 表，其键名为 `Id`，其字段如上图所示。请务必输入正确的数据，包括要用来测试此使用案例的有效手机号。有关更多信息，请参阅[创建表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)。
+ 具有执行 Lambda 函数的附加权限的 IAM 角色。
+ 一个用于托管 Lambda 函数的 Amazon S3 存储桶。

您可以手动创建这些资源，但我们建议 CloudFormation 按照本教程中的说明使用配置这些资源。

### 使用创建 AWS 资源 CloudFormation
<a name="api-gateway-invoking-lambda-resources-cli"></a>

CloudFormation 使您能够以可预测的方式重复创建和配置 AWS 基础架构部署。有关的更多信息 CloudFormation，请参阅《[AWS CloudFormation 用户指南》](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/)。

要使用以下方法创建 CloudFormation 堆栈 AWS CLI：

1. 按照《 AWS CLI [AWS CLI 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)》中的说明进行安装和配置。

1. 在项目文件夹的根目录`setup.yaml`中创建一个名为的文件，然后将[此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/setup.yaml)的内容复制 GitHub到该文件中。
**注意**  
该 CloudFormation 模板是使用[此处 AWS CDK 提供的模板生成的 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/resources/cdk/lambda_using_api_gateway)。有关更多信息 AWS CDK，请参阅《[AWS Cloud Development Kit (AWS CDK) 开发人员指南》](https://docs.aws.amazon.com/cdk/latest/guide/)。

1. 从命令行运行以下命令，*STACK\$1NAME*替换为堆栈的唯一名称。
**重要**  
堆栈名称在 AWS 区域和 AWS 账户中必须是唯一的。您最多可指定 128 个字符，支持数字和连字符。

   ```
   aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM
   ```

   有关 `create-stack` 命令参数的更多信息，请参阅 [AWS CLI 命令参考指南](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html)和 [CloudFormation 用户指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html)。

1. 接下来，按照[填充表](#api-gateway-invoking-lambda-resources-create-table)过程填充表。

### 填充表
<a name="api-gateway-invoking-lambda-resources-create-table"></a>

要填充表，请先创建一个名为 `libs` 的目录，然后在其中创建一个名为 `dynamoClient.js` 的文件，再将下面的内容粘贴到其中。

```
const { DynamoDBClient } = require ( "@aws-sdk/client-dynamodb" );
// Set the AWS Region.
const REGION = "REGION"; // e.g. "us-east-1"
 // Create an Amazon Lambda service client object.
const dynamoClient = new DynamoDBClient({region:REGION});
module.exports = { dynamoClient };
```

 此代码可从[此处获](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/libs/dynamoClient.js)得 GitHub。

接下来，在项目文件夹的根目录`populate-table.js`中创建一个名为的文件，并将[此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/populate-table.js)的内容复制 GitHub到该文件中。对于其中一项，将 `phone` 属性的值替换为 E.164 格式的有效手机号码，将 `startDate` 的值替换为今天的日期。

在命令行处，运行以下命令。

```
node populate-table.js
```

```
const { BatchWriteItemCommand } = require ( "aws-sdk/client-dynamodb" );
const {dynamoClient} = require ( "./libs/dynamoClient" );

// Set the parameters.
export const params = {
  RequestItems: {
    Employees: [
      {
        PutRequest: {
          Item: {
            id: { N: "1" },
            firstName: { S: "Bob" },
            phone: { N: "155555555555654" },
            startDate: { S: "2019-12-20" },
          },
        },
      },
      {
        PutRequest: {
          Item: {
            id: { N: "2" },
            firstName: { S: "Xing" },
            phone: { N: "155555555555653" },
            startDate: { S: "2019-12-17" },
          },
        },
      },
      {
        PutRequest: {
          Item: {
            id: { N: "55" },
            firstName: { S: "Harriette" },
            phone: { N: "155555555555652" },
            startDate: { S: "2019-12-19" },
          },
        },
      },
    ],
  },
};

export const run = async () => {
  try {
    const data = await dbclient.send(new BatchWriteItemCommand(params));
    console.log("Success", data);
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

 此代码可从[此处获](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/populate-table.js)得 GitHub。

## 创建 AWS Lambda 函数
<a name="api-gateway-invoking-lambda-browser-script"></a>

### 配置 SDK
<a name="api-gateway-invoking-lambda-configure-sdk"></a>

在 `libs` 目录中，创建名为 `snsClient.js` 和 `lambdaClient.js` 的文件，并将以下内容分别粘贴到这些文件中。

```
const { SNSClient } = require("@aws-sdk/client-sns");
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create an Amazon SNS service client object.
const snsClient = new SNSClient({ region: REGION });
module.exports = { snsClient };
```

 *REGION*替换为 AWS 区域。此代码可从[此处获](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/libs/snsClient.js)得 GitHub。

```
const { LambdaClient } = require("@aws-sdk/client-lambda");
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create an Amazon Lambda service client object.
const lambdaClient = new LambdaClient({ region: REGION });
module.exports = { lambdaClient };
```

*REGION*替换为 AWS 区域。此代码可从[此处获](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/libs/lambdaClient.js)得 GitHub。

首先，导入所需的 适用于 JavaScript 的 AWS SDK (v3) 模块和命令。然后计算今天的日期并将其分配给一个参数。然后，为 `ScanCommand` 创建参数。*TABLE\$1NAME*替换为您在本示例[创建 AWS 资源](#api-gateway-invoking-lambda-provision-resources)部分中创建的表的名称。

下面的代码段演示了此步骤。（有关完整示例，请参阅[捆绑 Lambda 函数](#api-gateway-invoking-lambda-full)。）

```
const { ScanCommand } = require("@aws-sdk/client-dynamodb");
const { PublishCommand } = require("@aws-sdk/client-sns");
const { snsClient } = require("./libs/snsClient");
const { dynamoClient } = require("./libs/dynamoClient");

// Get today's date.
const today = new Date();
const dd = String(today.getDate()).padStart(2, "0");
const mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0!
const yyyy = today.getFullYear();
const date = `${yyyy}-${mm}-${dd}`;

// Set the parameters for the ScanCommand method.
const params = {
  // Specify which items in the results are returned.
  FilterExpression: "startDate = :topic",
  // Define the expression attribute value, which are substitutes for the values you want to compare.
  ExpressionAttributeValues: {
    ":topic": { S: date },
  },
  // Set the projection expression, which are the attributes that you want.
  ProjectionExpression: "firstName, phone",
  TableName: "Employees",
};
```

### 扫描 DynamoDB 表
<a name="api-gateway-invoking-lambda-scan-table"></a>

首先，创建一个名为的 async/await 函数`sendText`，用于使用 Amazon SNS `PublishCommand` 发布一条短信。然后，添加一个 `try` 块模式，用于扫描 DynamoDB 表中是否有工作周年纪念日在今天的员工，然后调用 `sendText` 函数向这些员工发送短信。如果发生错误，则将调用 `catch` 块。

下面的代码段演示了此步骤。（有关完整示例，请参阅[捆绑 Lambda 函数](#api-gateway-invoking-lambda-full)。）

```
// Helper function to send message using Amazon SNS.
exports.handler = async () => {
  // Helper function to send message using Amazon SNS.
  async function sendText(textParams) {
    try {
      await snsClient.send(new PublishCommand(textParams));
      console.log("Message sent");
    } catch (err) {
      console.log("Error, message not sent ", err);
    }
  }
  try {
    // Scan the table to identify employees with work anniversary today.
    const data = await dynamoClient.send(new ScanCommand(params));
    for (const element of data.Items) {
      const textParams = {
        PhoneNumber: element.phone.N,
        Message: `Hi ${element.firstName.S}; congratulations on your work anniversary!`,
      };
      // Send message using Amazon SNS.
      sendText(textParams);
    }
  } catch (err) {
    console.log("Error, could not scan table ", err);
  }
};
```

### 捆绑 Lambda 函数
<a name="api-gateway-invoking-lambda-full"></a>

本主题介绍如何将本示例的模块`mylambdafunction.ts`和必需的 适用于 JavaScript 的 AWS SDK 模块捆绑到名`index.js`为的捆绑文件中。

1. 如果您尚未安装 Webpack，请按照本示例中的[完成先决条件任务](#api-gateway-invoking-lambda-prerequisites)部分进行安装。
**注意**  
有关 *Webpack* 的信息，请参阅[使用 Webpack 捆绑应用程序](webpack.md)。

1. 在命令行中运行以下命令，将本示例 JavaScript 的捆绑到名为的文件中`<index.js>`：

   ```
   webpack mylambdafunction.ts --mode development --target node --devtool false --output-library-target umd -o index.js
   ```
**重要**  
请注意，输出被命名为 `index.js`。这是因为 Lambda 函数必须有一个 `index.js` 处理程序才能工作。

1. 将捆绑的输出文件 `index.js` 压缩到名为 `mylambdafunction.zip` 的 ZIP 文件中。

1. 将 `mylambdafunction.zip` 上传到您在本教程的[创建 AWS 资源](#api-gateway-invoking-lambda-provision-resources)主题中创建的 Amazon S3 存储桶。

## 部署 Lambda 函数
<a name="api-gateway-invoking-lambda-deploy-function"></a>

在项目的根目录中，创建一个 `lambda-function-setup.ts` 文件，然后将以下内容粘贴到其中。

*BUCKET\$1NAME*替换为您将 Lambda 函数的 ZIP 版本上传到的 Amazon S3 存储桶的名称。将 *ZIP\$1FILE\$1NAME* Lambda 函数的 ZIP 版本替换为命名的名称。*ROLE*替换为您在本教程[创建 AWS 资源](#api-gateway-invoking-lambda-provision-resources)主题中创建的 IAM 角色的 Amazon 资源编号 (ARN)。*LAMBDA\$1FUNCTION\$1NAME*替换为 Lambda 函数的名称。

```
// Load the required Lambda client and commands.
const {
  CreateFunctionCommand
} = require ( "@aws-sdk/client-lambda" );
const { lambdaClient} = require ( "./libs/lambdaClient.js );

// Set the parameters.
const params = {
  Code: {
    S3Bucket: "BUCKET_NAME", // BUCKET_NAME
    S3Key: "ZIP_FILE_NAME", // ZIP_FILE_NAME
  },
  FunctionName: "LAMBDA_FUNCTION_NAME",
  Handler: "index.handler",
  Role: "IAM_ROLE_ARN", // IAM_ROLE_ARN; e.g., arn:aws:iam::650138640062:role/v3-lambda-tutorial-lambda-role
  Runtime: "nodejs12.x",
  Description:
    "Scans a DynamoDB table of employee details and using Amazon Simple Notification Services (Amazon SNS) to " +
    "send employees an email on each anniversary of their start-date.",
};

const run = async () => {
  try {
    const data = await lambdaClient.send(new CreateFunctionCommand(params));
    console.log("Success", data); // successful response
  } catch (err) {
    console.log("Error", err); // an error occurred
  }
};
run();
```

在命令行中输入以下内容以部署 Lambda 函数。

```
node lambda-function-setup.ts
```

此代码示例可在此[处找到 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/lambda-function-setup.js)。

## 配置 API Gateway 以调用 Lambda 函数
<a name="api-gateway-invoking-lambda-run"></a>

**构建应用程序：**

1. [创建 rest API](#api-gateway-invoking-lambda-run-create)

1. [测试 API Gateway 方法](#api-gateway-invoking-lambda-run-test)

1. [部署 API Gateway 方法](#api-gateway-invoking-lambda-run-deploy)

### 创建 rest API
<a name="api-gateway-invoking-lambda-run-create"></a>

您可以使用 API Gateway 控制台为 Lambda 函数创建 rest 端点。完成后，您就可以使用 restful 调用来调用 Lambda 函数。



1. 登录 [Amazon API Gateway 控制台](https://console.aws.amazon.com/apigateway)。

1. 在 Rest API 下，选择**生成**。

1. 选择**新建 API**。  
![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/PicNewAPI.png)

1. 指定 **Employee** 作为 API 名称并提供描述。  
![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picEmployeeAPI.png)

1. 选择**创建 API**。

1. 在 **Employee** 部分下选择**资源**。  
![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picResources.png)

1. 在名称字段中，指定**员工**。

1. 选择**创建资源**。

1. 从**操作**下拉菜单中，选择**创建资源**。  
![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picCreateResources.png)

1. 选择 **/employees**，从**操作**中选择**创建方法**，然后从 **/employees** 下的下拉菜单中选择 **GET**。选择复选标记图标。  
![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picGet.png)

1. 选择 **Lambda 函数**并输入 m**mylambdafunction** 作为 Lambda 函数名称。选择**保存**。

### 测试 API Gateway 方法
<a name="api-gateway-invoking-lambda-run-test"></a>

在本教程中，您可以测试调用 **mylambdafunction** Lambda 函数的 API Gateway 方法。要测试该方法，请选择**测试**，如下图所示。

![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picTest.png)


调用 Lambda 函数后，您可以查看日志文件以查看成功消息。

### 部署 API Gateway 方法
<a name="api-gateway-invoking-lambda-run-deploy"></a>

测试成功后，您可以从 [Amazon API Gateway 控制台](https://console.aws.amazon.com/apigateway)部署该方法。

1. 选择 **GET**。  
![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picGetDeploy.png)

1. 从**操作**下拉列表中，选择**部署 API**。  
![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picDeployMethod.png)

1. 填写**部署 API** 表单，然后选择**部署**。  
![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picDeployMethod.png)

1.  选择**保存更改**。

1.  再次选择 **GET**，可以看到 URL 已更改。这是您可以用来调用 Lambda 函数的调用 URL。  
![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picURL2.png)

## 删除资源
<a name="api-gateway-invoking-lambda-destroy"></a>

恭喜您！您已使用 适用于 JavaScript 的 AWS SDK通过 Amazon API Gateway 调用了 Lambda 函数。如本教程开头所述，请务必在学习本教程时终止您创建的所有资源，以确保系统不会向您收费。为此，您可以删除在本教程[创建 AWS 资源](#api-gateway-invoking-lambda-provision-resources)主题中创建的 CloudFormation 堆栈，如下所示：

1. [CloudFormation 在 AWS 管理控制台中]( https://console.aws.amazon.com/cloudformation/home)打开。

1. 打开**堆栈**页面，然后选择堆栈。

1. 选择**删除**。

# 创建计划事件以执行 AWS Lambda 函数
<a name="scheduled-events-invoking-lambda-example"></a>

您可以使用 Ama CloudWatch zon 事件创建调用 AWS Lambda 函数的计划事件。您可以将 CloudWatch 事件配置为使用 cron 表达式来安排何时调用 Lambda 函数。例如，您可以安排一个 CloudWatch 事件，使其在每个工作日调用 Lambda 函数。

AWS Lambda 是一项计算服务，使您无需预置或管理服务器即可运行代码。您可以使用各种编程语言创建 Lambda 函数。有关的更多信息 AWS Lambda，请参阅[什么是 AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)。

在本教程中，您将使用 Lambda 运行时 API 创建 Lambda 函数。 JavaScript此示例调用不同的 AWS 服务来执行特定的用例。例如，假设组织在员工入职一周年纪念日时向员工发送移动短信表示祝贺，如下图所示。

![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picPhone.png)


完成本教程大约需要 20 分钟。

本教程向您展示如何使用 JavaScript 逻辑来创建执行此用例的解决方案。例如，您将学习如何使用 Lambda 函数读取数据库以确定哪些员工已达到入职一周年纪念日、如何处理数据以及如何发送短信。然后，您将学习如何使用 cron 表达式在每个工作日调用 Lambda 函数。

本 AWS 教程使用名为 Employee 的 Amazon DynamoDB 表，其中包含这些字段。
+ **id** - 表的主键。
+ **firstName** - 员工的名字。
+ **phone** - 员工的电话号码。
+ **startDate** - 员工的入职日期。

![\[DynamoDB 表\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/apigateway_example/pic00.png)


**重要**  
完成费用：本文档中包含的 AWS 服务包含在 AWS 免费套餐中。但是，请务必在完成本教程后终止所有资源，以确保系统不会向您收费。

**构建应用程序：**

1. [满足先决条件](#scheduled-events-invoking-lambda-provision-resources)

1. [创建 AWS 资源](#scheduled-events-invoking-lambda-provision-resources)

1. [准备浏览器脚本](#scheduled-events-invoking-lambda-browser-script)

1. [创建并上传 Lambda 函数](#scheduled-events-invoking-lambda-browser-script)

1. [部署 Lambda 函数](#scheduled-events-invoking-lambda-deploy-function)

1. [运行应用程序](#scheduled-events-invoking-lambda-run)

1. [删除资源](#scheduled-events-invoking-lambda-destroy)

## 完成先决条件任务
<a name="scheduled-events-invoking-lambda-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node.js TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lex-bot/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

## 创建 AWS 资源
<a name="scheduled-events-invoking-lambda-provision-resources"></a>

本教程要求具有以下资源。
+ 一个名为 **Employee** 的 Amazon DynamoDB 表，其键名为 **Id**，其字段如上图所示。请务必输入正确的数据，包括要用来测试此使用案例的有效手机号。有关更多信息，请参阅[创建表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)。
+ 具有执行 Lambda 函数的附加权限的 IAM 角色。
+ 一个用于托管 Lambda 函数的 Amazon S3 存储桶。

您可以手动创建这些资源，但我们建议 CloudFormation 按照本教程中的说明使用配置这些资源。

### 使用创建 AWS 资源 CloudFormation
<a name="scheduled-events-invoking-lambda-resources-cli"></a>

CloudFormation 使您能够以可预测的方式重复创建和配置 AWS 基础架构部署。有关的更多信息 CloudFormation，请参阅《[AWS CloudFormation 用户指南》](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/)。

要使用以下方法创建 CloudFormation 堆栈 AWS CLI：

1. 按照《 AWS CLI [AWS CLI 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)》中的说明进行安装和配置。

1. 在项目文件夹的根目录`setup.yaml`中创建一个名为的文件，然后将[此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-scheduled-events/setup.yaml)的内容复制 GitHub到该文件中。
**注意**  
该 CloudFormation 模板是使用[此处 AWS CDK 提供的模板生成的 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/resources/cdk/lambda_using_scheduled_events)。有关更多信息 AWS CDK，请参阅《[AWS Cloud Development Kit (AWS CDK) 开发人员指南》](https://docs.aws.amazon.com/cdk/latest/guide/)。

1. 从命令行运行以下命令，*STACK\$1NAME*替换为堆栈的唯一名称。
**重要**  
堆栈名称在 AWS 区域和 AWS 账户中必须是唯一的。您最多可指定 128 个字符，支持数字和连字符。

   ```
   aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM
   ```

   有关 `create-stack` 命令参数的更多信息，请参阅 [AWS CLI 命令参考指南](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html)和 [CloudFormation 用户指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html)。

   在控制台中打开堆栈，然后选择 “资源” 选项卡， CloudFormation 即可查看控制台中的**资源**列表。您将在本教程中需要这些内容。

1. 创建堆栈后，使用填充 DynamoDB 表，如中所述。 适用于 JavaScript 的 AWS SDK [填充 DynamoDB 表](#scheduled-events-invoking-lambda-resources-create-table)

### 填充 DynamoDB 表
<a name="scheduled-events-invoking-lambda-resources-create-table"></a>

要填充表，请先创建一个名为 `libs` 的目录，然后在其中创建一个名为 `dynamoClient.js` 的文件，再将下面的内容粘贴到其中。

```
const { DynamoDBClient } = require( "@aws-sdk/client-dynamodb" );
// Set the AWS Region.
const REGION = "REGION"; // e.g. "us-east-1"
// Create an Amazon DynamoDB service client object.
const dynamoClient = new DynamoDBClient({region:REGION});
module.exports = { dynamoClient };
```

 此代码可从[此处获](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-scheduled-events/src/libs/dynamoClient.js)得 GitHub。

接下来，在项目文件夹的根目录`populate-table.js`中创建一个名为的文件，并将[此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/populate-table.js)的内容复制 GitHub到该文件中。对于其中一项，将 `phone` 属性的值替换为 E.164 格式的有效手机号码，将 `startDate` 的值替换为今天的日期。

在命令行处，运行以下命令。

```
node populate-table.js
```

```
const {
BatchWriteItemCommand } = require( "aws-sdk/client-dynamodb" );
const {dynamoClient} = require(  "./libs/dynamoClient" );
// Set the parameters.
const params = {
  RequestItems: {
    Employees: [
      {
        PutRequest: {
          Item: {
            id: { N: "1" },
            firstName: { S: "Bob" },
            phone: { N: "155555555555654" },
            startDate: { S: "2019-12-20" },
          },
        },
      },
      {
        PutRequest: {
          Item: {
            id: { N: "2" },
            firstName: { S: "Xing" },
            phone: { N: "155555555555653" },
            startDate: { S: "2019-12-17" },
          },
        },
      },
      {
        PutRequest: {
          Item: {
            id: { N: "55" },
            firstName: { S: "Harriette" },
            phone: { N: "155555555555652" },
            startDate: { S: "2019-12-19" },
          },
        },
      },
    ],
  },
};

export const run = async () => {
  try {
    const data = await dbclient.send(new BatchWriteItemCommand(params));
    console.log("Success", data);
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

 此代码可从[此处获](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-scheduled-events/src/helper-functions/populate-table.js)得 GitHub。

## 创建 AWS Lambda 函数
<a name="scheduled-events-invoking-lambda-browser-script"></a>

### 配置 SDK
<a name="scheduled-events-invoking-lambda-configure-sdk"></a>

首先导入所需的 适用于 JavaScript 的 AWS SDK (v3) 模块和命令：`DynamoDBClient`以及 Dynamo `ScanCommand` DB `SNSClient` 和 Amazon SNS 命令。`PublishCommand`*REGION*替换为 AWS 区域。然后计算今天的日期并将其分配给一个参数。然后使用您在本示例[创建 AWS 资源](#scheduled-events-invoking-lambda-provision-resources)部分中创建*TABLE\$1NAME*的表的名称为 `ScanCommand` .Replace 创建参数。

下面的代码段演示了此步骤。（有关完整示例，请参阅[捆绑 Lambda 函数](#scheduled-events-invoking-lambda-full)。）

```
"use strict";
// Load the required clients and commands.
const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb");
const { SNSClient, PublishCommand } = require("@aws-sdk/client-sns");

//Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"

// Get today's date.
const today = new Date();
const dd = String(today.getDate()).padStart(2, "0");
const mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0!
const yyyy = today.getFullYear();
const date = yyyy + "-" + mm + "-" + dd;

// Set the parameters for the ScanCommand method.
const params = {
  // Specify which items in the results are returned.
  FilterExpression: "startDate = :topic",
  // Define the expression attribute value, which are substitutes for the values you want to compare.
  ExpressionAttributeValues: {
    ":topic": { S: date },
  },
  // Set the projection expression, which the the attributes that you want.
  ProjectionExpression: "firstName, phone",
  TableName: "TABLE_NAME",
};
```

### 扫描 DynamoDB 表
<a name="scheduled-events-invoking-lambda-scan-table"></a>

首先创建一个名为的 async/await 函数`sendText`，用于使用 Amazon SNS `PublishCommand` 发布一条短信。然后，添加一个 `try` 块模式，用于扫描 DynamoDB 表中是否有工作周年纪念日在今天的员工，然后调用 `sendText` 函数向这些员工发送短信。如果发生错误，则将调用 `catch` 块。

下面的代码段演示了此步骤。（有关完整示例，请参阅[捆绑 Lambda 函数](#scheduled-events-invoking-lambda-full)。）

```
exports.handler = async (event, context, callback) => {
  // Helper function to send message using Amazon SNS.
  async function sendText(textParams) {
    try {
      const data = await snsclient.send(new PublishCommand(textParams));
      console.log("Message sent");
    } catch (err) {
      console.log("Error, message not sent ", err);
    }
  }
  try {
    // Scan the table to check identify employees with work anniversary today.
    const data = await dbclient.send(new ScanCommand(params));
    data.Items.forEach(function (element, index, array) {
      const textParams = {
        PhoneNumber: element.phone.N,
        Message:
          "Hi " +
          element.firstName.S +
          "; congratulations on your work anniversary!",
      };
      // Send message using Amazon SNS.
      sendText(textParams);
    });
  } catch (err) {
    console.log("Error, could not scan table ", err);
  }
};
```

### 捆绑 Lambda 函数
<a name="scheduled-events-invoking-lambda-full"></a>

本主题介绍如何将本示例的模块`mylambdafunction.js`和必需的 适用于 JavaScript 的 AWS SDK 模块捆绑到名`index.js`为的捆绑文件中。

1. 如果您尚未安装 Webpack，请按照本示例中的[完成先决条件任务](#scheduled-events-invoking-lambda-prerequisites)部分进行安装。
**注意**  
有关 *webpack* 的信息，请参阅[使用 Webpack 捆绑应用程序](webpack.md)。

1. 在命令行中运行以下命令，将本示例的捆绑到名 JavaScript 为的文件中`<index.js>`：

   ```
   webpack mylamdbafunction.js --mode development --target node --devtool false --output-library-target umd -o index.js
   ```
**重要**  
请注意，输出被命名为 `index.js`。这是因为 Lambda 函数必须有一个 `index.js` 处理程序才能工作。

1. 将捆绑的输出文件 `index.js` 压缩到名为 `my-lambda-function.zip` 的 ZIP 文件中。

1. 将 `mylambdafunction.zip` 上传到您在本教程的[创建 AWS 资源](#scheduled-events-invoking-lambda-provision-resources)主题中创建的 Amazon S3 存储桶。

以下是 `mylambdafunction.js` 的完整的浏览器脚本代码。

```
"use strict";
// Load the required clients and commands.
const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb");
const { SNSClient, PublishCommand } = require("@aws-sdk/client-sns");

//Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"

// Get today's date.
const today = new Date();
const dd = String(today.getDate()).padStart(2, "0");
const mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0!
const yyyy = today.getFullYear();
const date = yyyy + "-" + mm + "-" + dd;

// Set the parameters for the ScanCommand method.
const params = {
  // Specify which items in the results are returned.
  FilterExpression: "startDate = :topic",
  // Define the expression attribute value, which are substitutes for the values you want to compare.
  ExpressionAttributeValues: {
    ":topic": { S: date },
  },
  // Set the projection expression, which the the attributes that you want.
  ProjectionExpression: "firstName, phone",
  TableName: "TABLE_NAME",
};

// Create the client service objects.
const dbclient = new DynamoDBClient({ region: REGION });
const snsclient = new SNSClient({ region: REGION });

exports.handler = async (event, context, callback) => {
  // Helper function to send message using Amazon SNS.
  async function sendText(textParams) {
    try {
      const data = await snsclient.send(new PublishCommand(textParams));
      console.log("Message sent");
    } catch (err) {
      console.log("Error, message not sent ", err);
    }
  }
  try {
    // Scan the table to check identify employees with work anniversary today.
    const data = await dbclient.send(new ScanCommand(params));
    data.Items.forEach(function (element, index, array) {
      const textParams = {
        PhoneNumber: element.phone.N,
        Message:
          "Hi " +
          element.firstName.S +
          "; congratulations on your work anniversary!",
      };
      // Send message using Amazon SNS.
      sendText(textParams);
    });
  } catch (err) {
    console.log("Error, could not scan table ", err);
  }
};
```

## 部署 Lambda 函数
<a name="scheduled-events-invoking-lambda-deploy-function"></a>

在项目的根目录中，创建一个 `lambda-function-setup.js` 文件，然后将以下内容粘贴到其中。

*BUCKET\$1NAME*替换为您将 Lambda 函数的 ZIP 版本上传到的 Amazon S3 存储桶的名称。将 *ZIP\$1FILE\$1NAME* Lambda 函数的 ZIP 版本替换为命名的名称。*IAM\$1ROLE\$1ARN*替换为您在本教程[创建 AWS 资源](#scheduled-events-invoking-lambda-provision-resources)主题中创建的 IAM 角色的 Amazon 资源编号 (ARN)。*LAMBDA\$1FUNCTION\$1NAME*替换为 Lambda 函数的名称。

```
// Load the required Lambda client and commands.
const {
   CreateFunctionCommand,
} = require("@aws-sdk/client-lambda");
const {
   lambdaClient
} = require("..libs/lambdaClient.js");

// Instantiate an Lambda client service object.
const lambda = new LambdaClient({ region: REGION });

// Set the parameters.
const params = {
  Code: {
    S3Bucket: "BUCKET_NAME", // BUCKET_NAME
    S3Key: "ZIP_FILE_NAME", // ZIP_FILE_NAME
  },
  FunctionName: "LAMBDA_FUNCTION_NAME",
  Handler: "index.handler",
  Role: "IAM_ROLE_ARN", // IAM_ROLE_ARN; e.g., arn:aws:iam::650138640062:role/v3-lambda-tutorial-lambda-role
  Runtime: "nodejs12.x",
  Description:
    "Scans a DynamoDB table of employee details and using Amazon Simple Notification Services (Amazon SNS) to " +
    "send employees an email the each anniversary of their start-date.",
};

const run = async () => {
  try {
    const data = await lambda.send(new CreateFunctionCommand(params));
    console.log("Success", data); // successful response
  } catch (err) {
    console.log("Error", err); // an error occurred
  }
};
run();
```

在命令行中输入以下内容以部署 Lambda 函数。

```
node lambda-function-setup.js
```

此代码示例可在此[处找到 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-scheduled-events/src/helper-functions/lambda-function-setup.js)。

## 配置 CloudWatch 为调用 Lambda 函数
<a name="scheduled-events-invoking-lambda-run"></a>

 CloudWatch 要配置为调用 Lambda 函数，请执行以下操作：

1. 打开 Lambda 控制台的**函数**页面。

1. 选择 Lambda 函数。

1. 在**设计器**下方，选择**添加触发器**。

1. 将触发器类型设置为 **CloudWatch Events/ EventBridge**。

1. 对于“规则”，选择**创建新规则**。

1.  填写“规则名称”和“规则描述”。

1. 对于规则类型，请选择**计划表达式**。

1. 在**计划表达式**字段中，输入一个 cron 表达式。例如，**cron(0 12 ? \$1 MON-FRI \$1)**。

1. 选择**添加**。
**注意**  
有关更多信息，请参阅将 [Lambda 与事件配合 CloudWatch 使用](https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents.html)。

## 删除资源
<a name="scheduled-events-invoking-lambda-destroy"></a>

恭喜您！您已使用亚马逊 CloudWatch 计划的事件调用了 Lambda 函数。 适用于 JavaScript 的 AWS SDK如本教程开头所述，请务必在学习本教程时终止您创建的所有资源，以确保系统不会向您收费。为此，您可以删除在本教程[创建 AWS 资源](#scheduled-events-invoking-lambda-provision-resources)主题中创建的 CloudFormation 堆栈，如下所示：

1. 打开 [CloudFormation 控制台]( https://console.aws.amazon.com/cloudformation/home)。

1. 在**堆栈**页面上，选择堆栈。

1. 选择**删除**。

# 构建 Amazon Lex 聊天机器人
<a name="lex-bot-example"></a>

您可以在 Web 应用程序中创建 Amazon Lex 聊天机器人来吸引您的网站访问者。Amazon Lex 聊天机器人是一种无需与人直接接触即可与用户进行在线聊天对话的功能。例如，下图显示了一个 Amazon Lex 聊天机器人，该聊天机器人针对预订酒店房间与用户进行交流。

![\[Chatbot interface demonstrating a hotel booking conversation with user inputs and bot responses.\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/lex_example/chatintro.png)


在本 AWS 教程中创建的 Amazon Lex 聊天机器人能够处理多种语言。例如，说法语的用户可以输入法语文本并收到以法语返回的回复。

![\[Chatbot interface demonstrating Amazon Lex integration with French language support.\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/lex_example/LanChatBot2.png)


同样，用户可以用意大利语与 Amazon Lex 聊天机器人进行交流。

![\[Chat interface showing Italian language exchange between user and Amazon Lex chatbot.\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/lex_example/LanChatBot3.png)


本 AWS 教程将指导你创建 Amazon Lex 聊天机器人并将其集成到 Node.js 网络应用程序中。 适用于 JavaScript 的 AWS SDK (v3) 用于调用以下 AWS 服务：
+ Amazon Lex
+ Amazon Comprehend
+ Amazon Translate

**完成费用：**本文档中包含的 AWS 服务包含在[AWS 免费套餐](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc)中。

**注意：**在学习本教程时，请务必终止您创建的所有资源，以确保系统不会向您收费。

**构建应用程序：**

1. [先决条件](#lex-bot-example-prerequisites)

1. [预置资源](#lex-bot-provision-resources)

1. [创建 Amazon Lex 聊天机器人](#lex-bot-example-create-lex-bot)

1. [创建 HTML](#lex-bot-example-html)

1. [创建浏览器脚本](#lex-bot-example-script)

1. [后续步骤](#lex-bot-example-next-steps)

## 先决条件
<a name="lex-bot-example-prerequisites"></a>

要设置和运行此示例，您必须先完成以下任务：
+ 设置项目环境以运行这些 Node TypeScript 示例，并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作[ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cross-services/lambda-scheduled-events/README.md)。
+ 使用用户凭证创建共享配置文件。有关提供共享凭据文件的更多信息，请参阅[和*工具参考指南中的共享配置AWS SDKs 和*凭据文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

**重要**  
此示例使用 ECMAScript6 (ES6)。这需要使用 Node.js 版本 13.x 或更高版本。要下载并安装最新版本的 Node.js，请参阅 [Node.js 下载](https://nodejs.org/en/download)。  
但是，如果您更喜欢使用 CommonJS 语法，请参阅 [JavaScript ES6/CommonJS 语法](sdk-example-javascript-syntax.md)。

## 创建 AWS 资源
<a name="lex-bot-provision-resources"></a>

本教程要求具有以下资源。
+ 一个未经身份验证的 IAM 角色，附加了以下权限：
  + Amazon Comprehend
  + Amazon Translate
  + Amazon Lex

您可以手动创建这些资源，但我们建议使用本教程 AWS CloudFormation 中所述配置这些资源。

### 使用创建 AWS 资源 CloudFormation
<a name="lex-bot-example-resources-cli"></a>

CloudFormation 使您能够以可预测的方式重复创建和配置 AWS 基础架构部署。有关的更多信息 CloudFormation，请参阅《[AWS CloudFormation 用户指南》](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/)。

要使用以下方法创建 CloudFormation 堆栈 AWS CLI：

1. 按照《 AWS CLI [AWS CLI 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)》中的说明进行安装和配置。

1. 在项目文件夹的根目录`setup.yaml`中创建一个名为的文件，然后将[此处](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lex-bot/setup.yaml)的内容复制 GitHub到该文件中。
**注意**  
该 CloudFormation 模板是使用[此处 AWS CDK 提供的模板生成的 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/resources/cdk/lex_bot_example_iam_unauth_role)。有关更多信息 AWS CDK，请参阅《[AWS Cloud Development Kit (AWS CDK) 开发人员指南》](https://docs.aws.amazon.com/cdk/latest/guide/)。

1. 从命令行运行以下命令，*STACK\$1NAME*替换为堆栈的唯一名称。
**重要**  
堆栈名称在 AWS 区域和 AWS 账户中必须是唯一的。您最多可指定 128 个字符，支持数字和连字符。

   ```
   aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM
   ```

   有关 `create-stack` 命令参数的更多信息，请参阅 [AWS CLI 命令参考指南](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html)和 [CloudFormation 用户指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html)。

   要查看创建的资源，请打开 Amazon Lex 控制台，选择堆栈，然后选择**资源**选项卡。

## 创建 Amazon Lex 机器人
<a name="lex-bot-example-create-lex-bot"></a>

**重要**  
使用 Amazon Lex 控制台的 V1 创建机器人。此示例不适用于使用 V2 创建的机器人。

第一步是使用 Amazon Web Services 管理控制台创建 Amazon Lex 聊天机器人。在本示例中，使用了 Amazon Lex **BookTrip**示例。有关更多信息，请参阅 [BookTrip](https://docs.aws.amazon.com/lex/latest/dg/ex-book-trip.html)。
+ 在 [Amazon Web Services 控制台](https://console.aws.amazon.com/lex/)上登录 Amazon Web Services 管理控制台并打开 Amazon Lex 控制台。
+ 在“机器人”页面上，选择**创建**。
+ 选择**BookTrip**蓝图（保留默认的机器人名称 **BookTrip**）。  
![\[Interface for creating a chatbot, showing BookTrip sample with conversation flow and components.\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/lex_example/pic2.png)
+ 填写默认设置并选择**创建**（控制台显示**BookTrip**机器人）。在“编辑器”选项卡上，查看预配置目的的详细信息。
+ 在测试窗口中测试机器人。输入*我想预订酒店房间，*，开始测试。  
![\[Chat interface showing a hotel booking conversation with a bot asking for the city.\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/lex_example/ChatBotTest.png)
+ 选择 “**发布**” 并指定别名（使用时需要此值 适用于 JavaScript 的 AWS SDK）。

**注意**  
 你需要在 JavaScript 代码中引用**机器人名称****和机器人别名**。

## 创建 HTML
<a name="lex-bot-example-html"></a>

创建一个名为 `index.html`的文件。将以下代码复制并粘贴到 `index.html`。此 HTML 引用 `main.js`。这是 index.js 的捆绑版本，其中包含所需的 适用于 JavaScript 的 AWS SDK 模块。您将在 [创建 HTML](#lex-bot-example-html) 中创建此文件。 `index.html` 也引用 `style.css`，后者用于添加样式。

```
<!doctype html>
<head>
  <title>Amazon Lex - Sample Application (BookTrip)</title>
  <link type="text/css" rel="stylesheet" href="style.css" />
</head>

<body>
  <h1 id="title">Amazon Lex - BookTrip</h1>
  <p id="intro">
    This multiple language chatbot shows you how easy it is to incorporate
    <a
      href="https://aws.amazon.com/lex/"
      title="Amazon Lex (product)"
      target="_new"
      >Amazon Lex</a
    >
    into your web apps. Try it out.
  </p>
  <div id="conversation"></div>
  <input
    type="text"
    id="wisdom"
    size="80"
    value=""
    placeholder="J'ai besoin d'une chambre d'hôtel"
  />
  <br />
  <button onclick="createResponse()">Send Text</button>
  <script type="text/javascript" src="./main.js"></script>
</body>
```

此代码也可以在[此处找到 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/resources/cdk#running-a-cdk-app)。

## 创建浏览器脚本
<a name="lex-bot-example-script"></a>

创建一个名为 `index.js`的文件。将以下代码复制并粘贴到 `index.js`。导入所需的 适用于 JavaScript 的 AWS SDK 模块和命令。为 Amazon Lex、Amazon Comprehend 和 Amazon Translate 创建客户端。*REGION*替换为 AWS 区域，并*IDENTITY\$1POOL\$1ID*替换为您在中创建的身份池的 ID [创建 AWS 资源](#lex-bot-provision-resources)。要检索此身份池 ID，请在 Amazon Cognito 控制台中打开身份池，选择**编辑身份池**，然后在侧面菜单中选择**示例代码**。身份池 ID 将在控制台中以红色文本显示。

首先，创建一个 `libs` 目录，然后通过创建三个文件 `comprehendClient.js`、`lexClient.js` 和 `translateClient.js` 来创建所需的服务客户端对象。将下面的相应代码粘贴到每个文件中，然后*IDENTITY\$1POOL\$1ID*在每个文件中替换*REGION*和。

**注意**  
使用您在[使用创建 AWS 资源 CloudFormation](#lex-bot-example-resources-cli)中创建的 Amazon Cognito 身份池的 ID。

```
import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity";
import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity";
import { ComprehendClient } from "@aws-sdk/client-comprehend";

const REGION = "REGION";
const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID.

// Create an Amazon Comprehend service client object.
const comprehendClient = new ComprehendClient({
  region: REGION,
  credentials: fromCognitoIdentityPool({
    client: new CognitoIdentityClient({ region: REGION }),
    identityPoolId: IDENTITY_POOL_ID,
  }),
});

export { comprehendClient };
```

```
import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity";
import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity";
import { LexRuntimeServiceClient } from "@aws-sdk/client-lex-runtime-service";

const REGION = "REGION";
const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID.

// Create an Amazon Lex service client object.
const lexClient = new LexRuntimeServiceClient({
  region: REGION,
  credentials: fromCognitoIdentityPool({
    client: new CognitoIdentityClient({ region: REGION }),
    identityPoolId: IDENTITY_POOL_ID,
  }),
});

export { lexClient };
```

```
import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity";
import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity";
import { TranslateClient } from "@aws-sdk/client-translate";

const REGION = "REGION";
const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID.

// Create an Amazon Translate service client object.
const translateClient = new TranslateClient({
  region: REGION,
  credentials: fromCognitoIdentityPool({
    client: new CognitoIdentityClient({ region: REGION }),
    identityPoolId: IDENTITY_POOL_ID,
  }),
});

export { translateClient };
```

此代码可在此[处获得 GitHub。](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cross-services/lex-bot/src/libs) 。

接下来，创建一个 `index.js` 文件，并将以下代码粘贴到文件中。

 将*BOT\$1ALIAS*和*BOT\$1NAME*分别替换为您的 Amazon Lex 机器人的别名和名称，并*USER\$1ID*使用用户 ID。`createResponse` 异步函数将执行以下操作：
+ 将用户输入的文本导入浏览器，然后使用 Amazon Comprehend 来确定其语言代码。
+ 获取语言代码并使用 Amazon Translate 将文本翻译成英文。
+ 获取翻译后的文本并使用 Amazon Lex 生成响应。
+ 将响应发布到浏览器页面。

```
import { DetectDominantLanguageCommand } from "@aws-sdk/client-comprehend";
import { TranslateTextCommand } from "@aws-sdk/client-translate";
import { PostTextCommand } from "@aws-sdk/client-lex-runtime-service";
import { lexClient } from "./libs/lexClient.js";
import { translateClient } from "./libs/translateClient.js";
import { comprehendClient } from "./libs/comprehendClient.js";

let g_text = "";
// Set the focus to the input box.
document.getElementById("wisdom").focus();

function showRequest() {
  const conversationDiv = document.getElementById("conversation");
  const requestPara = document.createElement("P");
  requestPara.className = "userRequest";
  requestPara.appendChild(document.createTextNode(g_text));
  conversationDiv.appendChild(requestPara);
  conversationDiv.scrollTop = conversationDiv.scrollHeight;
}

function showResponse(lexResponse) {
  const conversationDiv = document.getElementById("conversation");
  const responsePara = document.createElement("P");
  responsePara.className = "lexResponse";

  const lexTextResponse = lexResponse;

  responsePara.appendChild(document.createTextNode(lexTextResponse));
  responsePara.appendChild(document.createElement("br"));
  conversationDiv.appendChild(responsePara);
  conversationDiv.scrollTop = conversationDiv.scrollHeight;
}

function handletext(text) {
  g_text = text;
  const xhr = new XMLHttpRequest();
  xhr.addEventListener("load", loadNewItems, false);
  xhr.open("POST", "../text", true); // A Spring MVC controller
  xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); //necessary
  xhr.send(`text=${text}`);
}

function loadNewItems() {
  showRequest();

  // Re-enable input.
  const wisdomText = document.getElementById("wisdom");
  wisdomText.value = "";
  wisdomText.locked = false;
}

// Respond to user's input.
const createResponse = async () => {
  // Confirm there is text to submit.
  const wisdomText = document.getElementById("wisdom");
  if (wisdomText?.value && wisdomText.value.trim().length > 0) {
    // Disable input to show it is being sent.
    const wisdom = wisdomText.value.trim();
    wisdomText.value = "...";
    wisdomText.locked = true;
    handletext(wisdom);

    const comprehendParams = {
      Text: wisdom,
    };
    try {
      const data = await comprehendClient.send(
        new DetectDominantLanguageCommand(comprehendParams),
      );
      console.log(
        "Success. The language code is: ",
        data.Languages[0].LanguageCode,
      );
      const translateParams = {
        SourceLanguageCode: data.Languages[0].LanguageCode,
        TargetLanguageCode: "en", // For example, "en" for English.
        Text: wisdom,
      };
      try {
        const data = await translateClient.send(
          new TranslateTextCommand(translateParams),
        );
        console.log("Success. Translated text: ", data.TranslatedText);
        const lexParams = {
          botName: "BookTrip",
          botAlias: "mynewalias",
          inputText: data.TranslatedText,
          userId: "chatbot", // For example, 'chatbot-demo'.
        };
        try {
          const data = await lexClient.send(new PostTextCommand(lexParams));
          console.log("Success. Response is: ", data.message);
          const msg = data.message;
          showResponse(msg);
        } catch (err) {
          console.log("Error responding to message. ", err);
        }
      } catch (err) {
        console.log("Error translating text. ", err);
      }
    } catch (err) {
      console.log("Error identifying language. ", err);
    }
  }
};
// Make the function available to the browser.
window.createResponse = createResponse;
```

此代码可在此[处获得 GitHub。](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cross-services/lex-bot/src/index.html) 。

现在使用 webpack 将`index.js`和 适用于 JavaScript 的 AWS SDK 模块捆绑到一个文件中`main.js`。

1. 如果您尚未安装 Webpack，请按照本示例中的[先决条件](#lex-bot-example-prerequisites)部分进行安装。
**注意**  
有关 *webpack* 的信息，请参阅[使用 Webpack 捆绑应用程序](webpack.md)。

1. 在命令行中运行以下命令，将本示例的捆绑到名 JavaScript 为的文件中`main.js`：

   ```
   webpack index.js --mode development --target web --devtool false -o main.js
   ```

## 后续步骤
<a name="lex-bot-example-next-steps"></a>

恭喜您！您创建了一个 Node.js 应用程序，该应用程序使用 Amazon Lex 来创建交互式用户体验。如本教程开头所述，请务必在学习本教程时终止您创建的所有资源，以确保系统不会向您收费。为此，您可以删除在本教程[创建 AWS 资源](#lex-bot-provision-resources)主题中创建的 CloudFormation 堆栈，如下所示：

1. 打开 [CloudFormation 控制台]( https://console.aws.amazon.com/cloudformation/home)。

1. 在**堆栈**页面上，选择堆栈。

1. 选择**删除**。

有关更多 AWS 跨服务示例，请参阅[适用于 JavaScript 的 AWS SDK 跨服务](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/tutorials.html)示例。