Node.js 我如何承诺AWS JavaScript SDK?

Node.js 我如何承诺AWS JavaScript SDK?,node.js,promise,amazon-dynamodb,bluebird,aws-sdk,Node.js,Promise,Amazon Dynamodb,Bluebird,Aws Sdk,我想使用承诺在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库,例如

我想使用承诺在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的例子

var Promise=require(“蓝鸟”);
var AWS=要求('AWS-sdk');
var发电机配置={
accessKeyId:process.env.AWS_ACCESS_KEY_ID,
secretAccessKey:process.env.AWS\u SECRET\u ACCESS\u KEY,
地区:process.env.AWS_地区
};
var dynamoDb=新AWS.dynamoDb(dynamoDb配置);
promisifyAll(Object.getPrototypeOf(dynamoDb));
您不能向任何方法添加
Async
,以获得预期版本。

, 我无法使用
promisifyAll(Object.getPrototypeOf(dynamoDb))

然而,以下几点对我很有用:

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


早就过时了,但是有一个npm模块可以简化这一点

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

ddb.getItem(params).promise().then(function(req) {
    var x = req.data.Item.someField;
});
编辑:我写这个答案已经有几年了,但由于最近它似乎获得了越来越多的选票,我想我应该更新它:
aws sdk promise
已被弃用,aws sdk的更新版本(如最近几年)包括内置的promise支持。要使用的promise实现可以通过
config.setPromisedDependence()
进行配置

例如,要获得
aws sdk
return
Q
承诺,可以使用以下配置:

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

AWS.config.setPromisesDependency(Q.Promise)
promise()
函数随后将直接返回
Q
承诺(使用
aws sdk promise
时,必须手动包装每个返回的承诺,例如使用
Q(…)
来获取
Q
承诺)

我们有一个始终在进行的npm模块
aws promised
,bluebird向aws sdk的每个客户机提供了该模块。我不确定使用上面提到的aws sdk promise
模块是否更可取,但这里就是


我们需要捐款,我们只花时间向我们实际使用的客户承诺,但还有很多事情要做,所以请做

AWS JavaScript SDK的2.3.0版本增加了对承诺的支持:

我相信现在可以在调用后附加
.promise()
,以承诺给定的方法

您可以看到它在2.6.12中开始引入

您可以在AWS的博客中看到它的使用示例


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

此解决方案最适合我:

//创建承诺对象
var putObjectPromise=s3.putObject({Bucket:'Bucket',Key:'Key'}).promise();
//如果成功,请执行以下操作:
putObjectPromise.then(函数(数据){
console.log('PutObject Successed');})
//如果承诺失败,则捕获错误:
.catch(函数(err){
console.log(err);});

那么,您是否尝试过
bluebird.promisifyAll(dynamodb)
?使用bluebird
var dynamodb=Promise.promisifyAll(新的AWS.dynamodb())因为aws sdk@^2.3.0已经支持promise。注意:bluebird.promisifyAll for aws sdk@^2.3.0将导致错误
模块初始化错误:TypeError
对我来说非常有效!我正在使用新的DynamoDB文档库。var docClient=new doc.DynamoDB();promisifyAll(Object.getPrototypeOf(docClient));您不想将
promisifyAll
作为构造函数调用。请省略第一个
新的
,很遗憾,Lambda不支持它:-(因此,我一直在尝试在Lambda中使用此功能,刚刚找到您的评论。为什么在Lambda中不使用此功能?您在哪里找到了这些信息?谢谢!如果您使用节点4.3.2,它应该在Lambda下工作,您甚至可以更改承诺库。如果您使用节点0.10.x,则必须更改承诺库,因为它不是ava本机支持。有关更多信息,请检查:也许这个答案应该提到如何在aws sdk中启用promise支持,而不仅仅是链接到概述页面。基本上需要的是
aws.config.setPromisedDependence(Q.promise)
使用Q,并对应于其他promise实现。有关详细信息,请访问,但请复制内容,而不仅仅是链接。请注意,这仅适用于某些功能。来自AWS文档:“注意:这目前仅适用于返回AWS.Request实例的操作。”这对我使用AWS非常有效。CognitoIdentityServiceProvider
。添加
bind
修复了错误
TypeError:This.makeRequest不是一个函数
。谢谢!你是对的,到目前为止,我已经成功地对每个AWS SDK服务使用了这种方法,只需复制、粘贴、重构!我喜欢将它们包装到迷你库中以供使用最大限度地提高Lambda中main index.js代码的可读性。为什么不接受这个答案?AWS版本3允许模块化使用AWS库,而不是要求整个AWS sdk。在没有全局AWS配置的情况下,有没有办法将DynamoDBClient的承诺依赖性设置为第三方承诺?
const AWS = require('aws-sdk')
const Q = require('q')

AWS.config.setPromisesDependency(Q.Promise)
let AWS = require('aws-sdk');
let lambda = new AWS.Lambda();

exports.handler = async (event) => {
    return await lambda.getAccountSettings().promise() ;
};
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));
}