2

AWS putItem関数で Bluebird の promisify 関数を使用したいと考えています。ドキュメントから、AWS.Request オブジェクトを返すことに注意してください。私はそのオブジェクトには興味がなく、理想的には db.putItem({...}); を呼び出すだけです。Promise を取得します。これは可能ですか?私が試してみたところ、promisify された関数は依然として AWS.Request オブジェクトを返します。これは妥当だと思いますが、この場合は私が望んでいるものではありません。

とりあえずPromiseオブジェクトを作って成功とエラーのデータをresolve/reject promise関数に手動でマッピングしているだけなのですが、戻り値以外にputItem関数(および他の関数の可能性があります) は、promisify に適しているようです。

リクエストに応じて、コードの関連部分を以下に示します。

//datastore.js

var AWS = require('aws-sdk');

var sharedDB;

if (!sharedDB) {
    AWS.config.update({accessKeyId: 'akid', secretAccessKey: 'secret', region: "us-west-2"});
    sharedDB = new AWS.DynamoDB();
    sharedDB.setEndpoint("http://localhost:8000");
    Promise.promisify(sharedDB.putItem); 
}

module.exports.sharedDB = sharedDB;

//user.js

var db = require('../datastore/dynamoDBConnection').sharedDB;
var Promise = require("bluebird");


function User() {
var user = this;
...

user.save = function () {
        var params = {
            Item: {
                username: {S: 'test'},
                passwordHash: {S: 'test'}
            },
            TableName: 'users',
            Expected: {
                username: {Exists: false}
            }
        };
        return db.putItem(params); //this is where I would like have a Promise returned.  Instead I get an AWS.Request object.
}
...
}
4

1 に答える 1

4

アップデート

Promisify を間違って使用しています。約束された関数を返します

var putItemAsync = Promise.promisify(sharedDB.putItem); 

そして使用しますputItemAsync。また、promisifyを 1 回だけ呼び出してキャッシュする必要があります。


PutItem はコールバックを受け取りますが、ストリームで解決されるため、それを約束するのは通常より少しトリッキーです。

return new Promise(function(resolve,reject){
    dynamoDB.putItem(
    {"TableName":"Table1",
        "Item":{
            "Color":{"S":"white"},
            "Name":{"S":"fancy vase"},
            "Weight":{"N":"2"}
        }
    }, function(result) {
        var wholeResult = [];
        result.on('data', function(chunk){
            wholeResult.push(chunk);
        });
        result.on('end', function(){ resolve(Buffer.concat(wholeResult))});
        result.on('error', function(e){ reject(new Error(e)); });
    });
});
于 2014-05-17T15:29:04.890 に答える