How to use Async and Await with AWS SDK Javascript
await
requires a Promise
. generateDataKey()
returns a AWS.Request
, not a Promise
. AWS.Request
are EventEmitters
(more or less) but have a promise
method that you can use.
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()
}());
If you are using aws-sdk with version > 2.x, you can tranform a aws.Request
to a promise with chain .promise()
function.
For your case:
try {
let key = await kms.generateDataKey().promise();
} catch (e) {
console.log(e);
}
the key
is a KMS.Types.GenerateDataKeyResponse
- the second param of callback(in callback style).
The e
is a AWSError
- The first param of callback func
note: await
expression only allowed within an async function
As of 2021 I'd suggest to use AWS SDK for JavaScript v3. It's a rewrite of v2 with some great new features
sample code:
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 new features
- modular architecture with a separate package for each service
- First-class TypeScript support
- New middleware stack