如何在AWS SDK Javascript中使用Async和Await

81

我正在使用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" 需要一个 Promise;而这个 Promise 又需要一个回调函数。 - SLaks
3个回答

130
如果您使用的是 aws-sdk 版本> 2.x,则可以使用链式函数 .promise()aws.Request 转换为 Promise。 对于您的情况:
  try {
    let key = await kms.generateDataKey().promise();
  } catch (e) {
    console.log(e);
  }

“key”是回调函数中的第二个参数 - 一个KMS.Types.GenerateDataKeyResponse

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

注意:只有在异步函数内才允许使用await表达式。


一个如何在try语句之外访问“key”的方法是什么? - mbspark
@mbspark,你可以先在try块外部创建key变量。但是,为什么要这样做呢? - hoangdv
我想在程序的其他地方使用 key。不过,最终我还是以另一种方式解决了我所尝试做的事情。 - mbspark

18
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 新特性


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接