web-dev-qa-db-ja.com

AWS JavaScript SDKをどのように約束しますか?

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
});
39
Martin Kretz

呼び出しに.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() ;
};
14
DefionsCode

AWS JavaScript SDKの2.3.0リリースでは、promiseのサポートが追加されました: http://aws.Amazon.com/releasenotes/8589740860839559

30
Majix

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を任意のメソッドに追加して、約束されたバージョンを取得することはできません。

24
Martin Kretz

期限切れですが、これを簡素化する 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)。

15
JHH

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));
}
5
C.J.

皆さん、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);
4
Cmag

CascadeEnergy/aws-promised

常に進行中のnpmモジュールaws-promisedがあり、これはaws-sdkの各クライアントのブルーバードを約束します。上記のaws-sdk-promiseモジュールを使用することが望ましいとは思いませんが、ここではそうです。

寄付が必要です。実際に使用するクライアントを約束するために時間をかけましたが、やるべきことはまだまだたくさんありますので、ぜひやってください!

1
nackjicholson

このソリューションは私に最適です:

// 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); });
0
joe