web-dev-qa-db-fra.com

Comment promettre le SDK JavaScript AWS?

Je veux utiliser le aws-sdk en JavaScript en utilisant des promesses.

Au lieu du style de rappel par défaut:

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

Je veux plutôt utiliser un style promesse :

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

Je crois que les appels peuvent maintenant être ajoutés avec .promise() pour promettre la méthode donnée.

Vous pouvez le voir commencer à être introduit dans 2.6.12 https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md#2612

Vous pouvez voir un exemple de son utilisation dans le blog 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() ;
};
14
DefionsCode

La version 2.3.0 du SDK JavaScript AWS a ajouté la prise en charge des promesses: http://aws.Amazon.com/releasenotes/8589740860839559

30
Majix

Vous pouvez utiliser une bibliothèque de promesses qui fait promisification , par exemple Bluebird .

Voici un exemple de promesse de 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));

Non, vous pouvez ajouter Async à n'importe quelle méthode pour obtenir la version promise.

24
Martin Kretz

Beaucoup de retard, mais il existe un module aws-sdk-promise npm qui simplifie cela.

Cela ajoute juste une fonction promise () qui peut être utilisée comme ceci:

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

[~ # ~] modifier [~ # ~] : Cela fait quelques années que j'ai écrit cette réponse, mais comme elle semble se lever- votes récents, je pensais que je le mettrais à jour: aws-sdk-promise est obsolète, et les versions les plus récentes (comme dans les dernières années) de aws-sdk incluent la version intégrée promettre un soutien. L'implémentation de promesse à utiliser peut être configurée via config.setPromisesDependency().

Par exemple, pour que aws-sdk Renvoie Q promesses, la configuration suivante peut être utilisée:

const AWS = require('aws-sdk')
const Q = require('q')

AWS.config.setPromisesDependency(Q.Promise)

La fonction promise() renverra alors directement les promesses Q (lorsque vous utilisez aws-sdk-promise, Vous deviez envelopper manuellement chaque promesse retournée, par exemple avec Q(...) pour obtenir Q promesses).

15
JHH

Avec async/wait, j'ai trouvé l'approche suivante assez propre et j'ai résolu le même problème pour DynamoDB. Cela fonctionne également avec ElastiCache Redis. Ne nécessite rien qui ne soit pas fourni avec l'image lambda par défaut.

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));
}
5
C.J.

Mes amis, je n'ai pas pu utiliser la Promise.promisifyAll(Object.getPrototypeOf(dynamoDb));

Cependant, ce qui suit a fonctionné pour moi:

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

ou

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

return S3.putObjectAsync(params);
4
Cmag

CascadeEnergy/aws-promised

Nous avons un module npm toujours en cours aws-promised qui promet le bluebird à chaque client de l'aws-sdk. Je ne suis pas sûr qu'il soit préférable d'utiliser le aws-sdk-promise module mentionné ci-dessus, mais le voici.

Nous avons besoin de contributions, nous avons seulement pris le temps de promettre les clients que nous utilisons réellement, mais il y en a beaucoup plus à faire, alors faites-le!

1
nackjicholson

Cette solution me convient le mieux:

// Create a promise object
var putObjectPromise = s3.putObject({Bucket: 'bucket', Key: 'key'}).promise(); 

// If successful, do this:
putObjectPromise.then(function(data) {
 console.log('PutObject succeeded'); })

// If the promise failed, catch the error:
.catch(function(err) { 
console.log(err); });
0
joe