【问题标题】:How to use Async and Await with AWS SDK Javascript如何通过 AWS SDK Javascript 使用 Async 和 Await
【发布时间】:2018-07-13 15:18:07
【问题描述】:

我正在使用 KMS 库处理 AWS 开发工具包。我想使用 async 和 await 而不是回调。

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

this.kms = new AWS.KMS();

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

但是,当包装在异步函数中时,这不起作用。

我如何在这里使用 async 和 await?

【问题讨论】:

  • await 需要一个承诺;需要回调。

标签: node.js aws-sdk aws-kms


【解决方案1】:

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

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

keyKMS.Types.GenerateDataKeyResponse - 回调的第二个参数(回调样式)。

eAWSError - 回调函数的第一个参数

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

【讨论】:

  • 如何在try语句之外访问key
  • @mbspark 您可以首先在try 块之外创建key 变量。但是,为什么?
  • 我想在程序的其他地方使用key。不过,我确实最终弄清楚了我想以不同的方式做些什么。
【解决方案2】:

await 需要 PromisegenerateDataKey() 返回 AWS.Request,而不是 PromiseAWS.RequestEventEmitters(或多或少),但您可以使用 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()
}());

【讨论】:

    【解决方案3】:

    从 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;
    };
    

    AWS SDK for JavaScript v3 新功能

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 2018-09-10
      相关资源
      最近更新 更多