Как использовать Async и Await с AWS SDK Javascript

Я работаю с SDK AWS, используя библиотеку KMS. Я хотел бы использовать async и ждать вместо обратных вызовов.

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

this.kms = new AWS.KMS();

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

Однако это не работает, когда завернуты в асинхронную функцию.

Как я могу использовать async и ждать здесь?

Ответ 1

Если вы используете aws-sdk с версией> 2.x, вы можете aws.Request в обещание с .promise() функции chain .promise(). Для вашего случая:

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

key является KMS.Types.GenerateDataKeyResponse - второй параметр обратного вызова (в стиле обратного вызова).

e - это AWSError - первый параметр функции обратного вызова

примечание: выражение await допускается только в асинхронной функции

Ответ 2

await требует Promise. generateDataKey() возвращает AWS.Request, а не Promise. AWS.Request являются EventEmitters (более или менее), но имеют 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()
}());