Bluebird在函数上使用返回值进行promisify

时间:2014-05-17 15:10:26

标签: node.js amazon-web-services promise amazon-dynamodb bluebird

我想在AWS putItem功能上使用Bluebird的promisify功能。从文档中注意到它返回一个AWS.Request对象。我对该对象不感兴趣,理想情况下我只需要调用db.putItem({...});并得到一个承诺。这可能吗?当我尝试它时,promisify'd函数仍然返回一个AWS.Request对象,我认为这是合理的,在这种情况下它不是我想要的。

暂时我只是创建一个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.
}
...
}

1 个答案:

答案 0 :(得分:4)

<强>更新

您使用的Promisify错误,返回宣传的功能。

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

并使用putItemAsync。此外,您只应调用promisify 一次并缓存它。


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)); });
    });
});