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
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版本.
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)
伙计们,我一直无法使用 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)
小智 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)
| 归档时间: |
|
| 查看次数: |
24678 次 |
| 最近记录: |