Как я могу обезопасить 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() ;
};
Ответ 2
Версия 2.3.0 для SDK JavaScript AWS добавила поддержку обещаний: http://aws.amazon.com/releasenotes/8589740860839559
Ответ 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
У нас всегда есть модуль 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); });