¿Cómo prometo el SDK de JavaScript de AWS?

Quiero usar el aws-sdk en JavaScript usando promesas.

En lugar del estilo de callback predeterminado:

dynamodb.getItem(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }); 

En cambio, quiero usar un estilo de promesa :

 dynamoDb.putItemAsync(params).then(function(data) { console.log(data); // successful response }).catch(function(error) { console.log(err, err.stack); // an error occurred }); 

Creo que las llamadas ahora se pueden .promise() con .promise() para promisificar el método dado.

Puede ver cómo comienza a introducirse en 2.6.12 https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md#2612

Puede ver un ejemplo de su uso en el blog de AWS https://aws.amazon.com/blogs/compute/node-js-8-10-runtime-now-available-in-aws-lambda/

 let AWS = require('aws-sdk'); let lambda = new AWS.Lambda(); exports.handler = async (event) => { return await lambda.getAccountSettings().promise() ; }; 

La versión 2.3.0 del AWS JavaScript SDK agregó soporte para promesas: http://aws.amazon.com/releasenotes/8589740860839559

Puede usar una biblioteca de promesas que haga promisificación , por ejemplo, Bluebird .

Aquí hay un ejemplo de cómo prometer DynamoDB.

 var Promise = require("bluebird"); var AWS = require('aws-sdk'); var dynamoDbConfig = { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, region: process.env.AWS_REGION }; var dynamoDb = new AWS.DynamoDB(dynamoDbConfig); Promise.promisifyAll(Object.getPrototypeOf(dynamoDb)); 

No se puede agregar Async a ningún método para obtener la versión promisificada.

Muy atrasado, pero hay un módulo aws-sdk-promise npm que simplifica esto.

Esto solo agrega una función promesa () que se puede usar así:

 ddb.getItem(params).promise().then(function(req) { var x = req.data.Item.someField; }); 

EDIT : Han pasado algunos años desde que escribí esta respuesta, pero como parece que últimamente se están acumulando votos, pensé que lo actualizaría: aws-sdk-promise está en desuso, y más reciente (como en el último par de años ) las versiones de aws-sdk incluyen soporte de promesa incorporado. La implementación de promesa de uso se puede configurar a través de config.setPromisesDependency() .

Por ejemplo, para que aws-sdk devuelva las promesas Q , se puede usar la siguiente configuración:

 const AWS = require('aws-sdk') const Q = require('q') AWS.config.setPromisesDependency(Q.Promise) 

La función promise() luego devolverá las promesas Q directamente (al usar aws-sdk-promise , tuvo que ajustar manualmente cada promesa devuelta, por ejemplo, con Q(...) para obtener las promesas Q ).

Amigos, no he podido utilizar Promise.promisifyAll(Object.getPrototypeOf(dynamoDb));

Sin embargo, lo siguiente funcionó para mí:

 this.DYNAMO = Promise.promisifyAll(new AWS.DynamoDB()); ... return this.DYNAMO.listTablesAsync().then(function (tables) { return tables; }); 

o

 var AWS = require('aws-sdk'); var S3 = Promise.promisifyAll(new AWS.S3()); return S3.putObjectAsync(params); 

CascadeEnergy / aws-prometido

Tenemos un módulo de npm aws-promised Promed siempre en progreso que aws-promised el bluebird de cada cliente de aws-sdk. No estoy seguro de que sea preferible utilizar el módulo aws-sdk-promise mencionado anteriormente, pero aquí está.

Necesitamos contribuciones, solo nos hemos tomado el tiempo para prometer a los clientes que realmente usamos, pero hay muchas más que hacer, ¡así que por favor háganlo!

Con async / await, encontré el siguiente enfoque bastante limpio y solucionado el mismo problema para mí para DynamoDB. Esto funciona también con ElastiCache Redis. No requiere nada que no venga con la imagen lambda predeterminada.

 const {promisify} = require('util'); const AWS = require("aws-sdk"); const dynamoDB = new AWS.DynamoDB.DocumentClient(); const dynamoDBGetAsync = promisify(dynamoDB.get).bind(dynamoDB); exports.handler = async (event) => { let userId="123"; let params = { TableName: "mytable", Key:{ "PK": "user-"+userId, "SK": "user-perms-"+userId } }; console.log("Getting user permissions from DynamoDB for " + userId + " with parms=" + JSON.stringify(params)); let result= await dynamoDBGetAsync(params); console.log("Got value: " + JSON.stringify(result)); }