如何宣传AWS JavaScript SDK?

Mar*_*etz 41 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
});
Run Code Online (Sandbox Code Playgroud)

我想要使​​用承诺风格:

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

小智 31

AWS JavaScript SDK的2.3.0版本增加了对promises的支持:http://aws.amazon.com/releasenotes/8589740860839559

  • 遗憾的是Lambda不支持.:-( (4认同)
  • 如果你使用节点4.3.2它应该在lambda下工作,你甚至可以更改Promise库.如果您正在使用节点0.10.x,那么您必须更改Promise库,因为它本身不可用.欲了解更多信息,请访问:https://github.com/aws/aws-sdk-js/blob/266875c2e6a6ef5f9ff875e2cdaf36e10018d2da/doc-src/guide/browser-making-requests.md#support-for-promises (3认同)
  • 所以,我一直试图让这个在Lambda工作,只是发现你的评论.为什么这不适用于Lambda?你在哪里找到这些信息?谢谢! (2认同)

Mar*_*etz 24

您可以使用一个承诺库,做promisification,如蓝鸟.

以下是如何宣传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));
Run Code Online (Sandbox Code Playgroud)

不是你可以添加Async到任何方法来获得promisified版本.

  • 对我来说很棒!我正在使用新的DynamoDB-doc lib.var docClient = new doc.DynamoDB(); Promise.promisifyAll(Object.getPrototypeOf(docClient)); (2认同)

JHH*_*JHH 15

方式已过期,但有一个aws-sdk-promise npm模块可以简化这一过程.

这只是添加了一个promise()函数,可以像这样使用:

ddb.getItem(params).promise().then(function(req) {
    var x = req.data.Item.someField;
});
Run Code Online (Sandbox Code Playgroud)

编辑:我写这个答案已经有几年了,但是因为它似乎最近起来了,所以我认为我会更新它:aws-sdk-promise被弃用,以及更新(如最近几年)的版本aws-sdk包含内置的promise支持.可以通过配置使用的promise实现config.setPromisesDependency().

例如,要aws-sdk返回Qpromise,可以使用以下配置:

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

AWS.config.setPromisesDependency(Q.Promise)
Run Code Online (Sandbox Code Playgroud)

promise()然后该函数将Q直接返回promises(使用时aws-sdk-promise,您必须手动包装每个返回的promise,例如Q(...)获取Qpromises).


小智 15

我相信现在可以附加调用.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() ;
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅适用于某些功能。来自 AWS Docs:“注意:这目前仅适用于返回 AWS.Request 实例的操作。” (3认同)

Cma*_*mag 5

伙计们,我一直无法使用 Promise.promisifyAll(Object.getPrototypeOf(dynamoDb));

但是,以下对我有用:

this.DYNAMO = Promise.promisifyAll(new AWS.DynamoDB());
...
return this.DYNAMO.listTablesAsync().then(function (tables) {
    return tables;
});
Run Code Online (Sandbox Code Playgroud)

或者

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

return S3.putObjectAsync(params);
Run Code Online (Sandbox Code Playgroud)

  • 您不想将 `Promise.promisifyAll` 作为构造函数调用。请省略第一个`new` (3认同)

小智 5

使用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));
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说非常适合“AWS.CognitoIdentityServiceProvider”。添加`bind` 修复了错误`TypeError: this.makeRequest is not a function`。 (2认同)