Как я могу обезопасить SDK JavaScript AWS?

Я хочу использовать aws-sdk в JavaScript, используя обещания.

Вместо стиля обратного вызова по умолчанию:

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

Вместо этого я хочу использовать стиль обещания:

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

Ответы

Ответ 1

Я считаю, что теперь вызовы могут быть добавлены с .promise() чтобы обещать данный метод.

Вы можете увидеть, как он начал внедряться в 2.6.12 https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md#2612.

Вы можете увидеть пример его использования в блоге 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() ;
};

Ответ 3

Вы можете использовать библиотеку обещаний, которая выполняет обещание, например Bluebird.

Вот пример того, как обещать 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));

Нельзя добавить Async к любому методу для получения обещанной версии.

Ответ 4

Путь давно, но есть модуль npm aws-sdk-обещания, который упрощает это.

Это просто добавляет функцию promise(), которую можно использовать так:

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

РЕДАКТИРОВАТЬ: Прошло несколько лет с тех пор, как я написал этот ответ, но так как он, кажется, в последнее время набирает голоса, я подумал, что я буду обновлять его: aws-sdk-promise устарело, и новее (как в, последняя пара лет) в версии aws-sdk есть встроенная поддержка обещаний. Используемая реализация обещания может быть настроена через config.setPromisesDependency().

Например, чтобы aws-sdk возвращал обещания Q, можно использовать следующую конфигурацию:

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

AWS.config.setPromisesDependency(Q.Promise)

Затем функция promise() будет возвращать обещания Q напрямую (при использовании aws-sdk-promise вы должны были обернуть каждое возвращенное обещание вручную, например, с помощью Q(...) чтобы получить обещания Q).

Ответ 5

Люди, я не смог использовать Promise.promisifyAll(Object.getPrototypeOf(dynamoDb));

Однако для меня работали следующие:

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

или

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

return S3.putObjectAsync(params);

Ответ 6

С async/await я нашел следующий подход, чтобы быть довольно чистым и исправил ту же самую проблему для меня для DynamoDB. Это также работает с ElastiCache Redis. Не требует ничего, что не связано со стандартным лямбда-изображением.

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));
}

Ответ 7

CascadeEnergy/AWS-обещанные

У нас всегда есть модуль npm aws-promised который синяя птица обещает каждому клиенту aws-sdk. Я не уверен, что предпочтительнее использовать aws-sdk-promise упомянутый выше, но вот он.

Нам нужны вклады, мы потратили только время, чтобы обещать клиентам, которых мы фактически используем, но есть еще много дел, поэтому, пожалуйста, сделайте это!

Ответ 8

Это решение работает лучше всего для меня:

// 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); });