我想使用promises在JavaScript中使用aws-sdk。
而不是默认的回调样式:
dynamodb.getItem(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
我想要使用promise样式:
dynamoDb.putItemAsync(params).then(function(data) {
console.log(data); // successful response
}).catch(function(error) {
console.log(err, err.stack); // an error occurred
});
答案 0 :(得分:30)
AWS JavaScript SDK的2.3.0版本增加了对promises的支持:http://aws.amazon.com/releasenotes/8589740860839559
答案 1 :(得分:24)
您可以使用执行promisification的承诺库,例如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
添加到任何方法来获得promisified版本。
答案 2 :(得分:13)
我相信现在可以使用.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 :(得分:4)
民间,
我无法使用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);
答案 4 :(得分:3)
使用async / await,我发现以下方法非常干净,并为DynamoDB修复了同样的问题。这也适用于ElastiCache Redis。不需要任何默认的lambda图像不带的东西。
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 :(得分:1)
我们总是在进行npm模块aws-promised
,它会对aws-sdk的每个客户端的蓝鸟进行宣传。我不确定使用上面提到的aws-sdk-promise
模块是否更可取,但现在就是这样。
我们需要捐款,我们只花时间宣传我们实际使用的客户,但还有很多事要做,所以请这样做!
答案 6 :(得分:0)
此解决方案最适合我:
// 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); });