如何通过 AWS SDK 使用 Async 和 Await Javascript

How to use Async and Await with AWS SDK Javascript

我正在使用 KMS 库使用 AWS SDK。我想使用 async 和 await 而不是回调。

import AWS, { KMS } from "aws-sdk";

this.kms = new AWS.KMS();

const key = await this.kms.generateDataKey();

然而,当包裹在异步函数中时,这不起作用。

如何在这里使用 async 和 await?

await 需要 PromisegenerateDataKey() returns a AWS.Request, not a Promise. AWS.Request are EventEmitters (more or less) but have a promise 您可以使用的方法。

import AWS, {
  KMS
} from "aws-sdk";

(async function() {
  const kms = new AWS.KMS();
  const keyReq = kms.generateDataKey()
  const key = await keyReq.promise();

  // Or just:
  // const key = await kms.generateDataKey().promise()
}());

如果您使用版本 > 2.x 的 aws-sdk,您可以将 aws.Request 转换为具有链 .promise() 函数的承诺。 对于您的情况:

  try {
    let key = await kms.generateDataKey().promise();
  } catch (e) {
    console.log(e);
  }

key 是一个 KMS.Types.GenerateDataKeyResponse - 回调的第二个参数(在回调样式中)。

e 是一个 AWSError - 回调函数的第一个参数

注意:await 表达式只允许在异步函数中使用

从 2021 年开始,我建议使用 AWS SDK for JavaScript v3。它是对 v2 的重写,具有一些很棒的新功能

示例代码:

const { KMSClient, GenerateDataKeyCommand } = require('@aws-sdk/client-kms');

const generateDataKey = async () => {
  const client = new KMSClient({ region: 'REGION' });
  const command = new GenerateDataKeyCommand({ KeyId: 'KeyId' });
  const response = await client.send(command);
  return response;
};

适用于 JavaScript v3 新功能的 AWS SDK