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.putItemAsync(params).then(function(data) {
console.log(data); // successful response
}).catch(function(error) {
console.log(err, err.stack); // an error occurred
});
呼び出しに.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() ;
};
AWS JavaScript SDKの2.3.0リリースでは、promiseのサポートが追加されました: http://aws.Amazon.com/releasenotes/8589740860839559
promisification を実行するpromiseライブラリを使用できます。 ブルーバード 。
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
を任意のメソッドに追加して、約束されたバージョンを取得することはできません。
期限切れですが、これを簡素化する aws-sdk-promise npmモジュールがあります。
これは、次のように使用できるpromise()関数を追加するだけです。
_ddb.getItem(params).promise().then(function(req) {
var x = req.data.Item.someField;
});
_
[〜#〜] edit [〜#〜]:この回答を書いてから数年が経ちましたが、最近投票して、私はそれを更新すると思った:_aws-sdk-promise
_は非推奨であり、新しい(たとえば、最後のカップルyears)バージョンのaws-sdkには-約束のサポート。使用するpromise実装は、config.setPromisesDependency()
を使用して構成できます。
たとえば、_aws-sdk
_がQ
promiseを返すようにするには、次の構成を使用できます。
_const AWS = require('aws-sdk')
const Q = require('q')
AWS.config.setPromisesDependency(Q.Promise)
_
promise()
関数はQ
promisesを直接返します(_aws-sdk-promise
_を使用する場合、返された各promiseを手動でラップする必要がありました。たとえば、Q(...)
を使用してQ
promises)。
Async/awaitを使用すると、次のアプローチが非常にクリーンであることがわかり、DynamoDBの同じ問題が修正されました。これはElastiCache Redisでも機能します。デフォルトのラムダ画像に付属していないものは必要ありません。
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));
}
皆さん、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);
常に進行中のnpmモジュールaws-promised
があり、これはaws-sdkの各クライアントのブルーバードを約束します。上記のaws-sdk-promise
モジュールを使用することが望ましいとは思いませんが、ここではそうです。
寄付が必要です。実際に使用するクライアントを約束するために時間をかけましたが、やるべきことはまだまだたくさんありますので、ぜひやってください!
このソリューションは私に最適です:
// 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); });