Node.js 我如何承诺AWS JavaScript SDK?
我想使用承诺在JavaScript中使用aws 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库,例如
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
returnQ
承诺,可以使用以下配置:
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)
?使用bluebirdvar 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));
}