如何宣传AWS JavaScript SDK?

时间:2014-10-20 21:47:24

标签: node.js promise amazon-dynamodb bluebird aws-sdk

我想使用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
});

7 个答案:

答案 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)

CascadeEnergy/aws-promised

我们总是在进行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); });