Redis node.js-链接调用以获取用户数据

Redis node.js-链接调用以获取用户数据,node.js,events,redis,publish-subscribe,Node.js,Events,Redis,Publish Subscribe,我有一个用户数据库:配置文件、产品、配置和用户可以拥有的其他东西。我正试图找到一种方法来成功地链接我的redis调用(“getAll”函数),这样我就可以返回一个包含所有这些内容的对象,比如: user = { profile: {}, products: {}, config: {}, ... } 以下是我访问它们的方式/我正在尝试做的事情: User.getAll = function(uid, next){ var user = {};

我有一个用户数据库:配置文件、产品、配置和用户可以拥有的其他东西。我正试图找到一种方法来成功地链接我的redis调用(“getAll”函数),这样我就可以返回一个包含所有这些内容的对象,比如:

user = {
    profile: {},
    products: {},
    config: {},
    ...
}
以下是我访问它们的方式/我正在尝试做的事情:

User.getAll = function(uid, next){

    var user = {};
    var multi = client.multi();

    var key = 'user' + uid;
    client.hgetall(key, function(err, profile){
        user.profile = profile;
        //signal that profile is ready
    }

    key = 'products:' + uid;
    client.smembers(key, function(err, arr){
        key = key + ':';
        for (i=0; i < arr.length; i++){
            multi.hgetall(key + arr[i]);
        }
        multi.exec(function(err, products){
            user.products = products;
            //signal that products is ready
        }));
    })

    if (ready) { //obviously this isn't correct.
      return next(null, user);
    }
}
User.getAll=函数(uid,下一个){
var user={};
var multi=client.multi();
var key='user'+uid;
client.hgetall(键、函数(错误、配置文件){
user.profile=profile;
//发出配置文件准备就绪的信号
}
键='产品:'+uid;
client.smembers(键、函数(err、arr){
键=键+':';
对于(i=0;i

收到所需的所有数据后,如何恢复?事件发射器是正确的选择吗?

我认为事件发射器在这里不是一个好的选择。您可以跟踪所有呼叫,如下所示:

User.getAll = function(uid, next){
    var requests = ["first", "second"];
    var check_request = function(_key) {
        var idx = requests.indexOf(_key);
        if (idx!==-1) {
            requests.splice(idx, 1);
        }
        if (!requests.length) {
            next(user);
        }
    };

    // ORIGINAL CODE + check_request
    var user = {};
    var multi = client.multi();

    var key = 'user' + uid;
    client.hgetall(key, function(err, profile){
        user.profile = profile;
        check_request("first");
    }

    key = 'products:' + uid;
    client.smembers(key, function(err, arr){
        key = key + ':';
        for (i=0; i < arr.length; i++){
            multi.hgetall(key + arr[i])
        }
        multi.exec(function(err, products){
            user.products = products;
            check_request("second");
        }));
    })
}
User.getAll=函数(uid,下一个){
var请求=[“第一”、“第二”];
var检查请求=功能(\u键){
var idx=requests.indexOf(_key);
如果(idx!=-1){
请求。拼接(idx,1);
}
如果(!requests.length){
下一步(用户);
}
};
//原始代码+检查请求
var user={};
var multi=client.multi();
var key='user'+uid;
client.hgetall(键、函数(错误、配置文件){
user.profile=profile;
检查请求(“第一次”);
}
键='产品:'+uid;
client.smembers(键、函数(err、arr){
键=键+':';
对于(i=0;i
显然,您将使用比
requests=[“first”,“second”]更有意义的东西,但我希望你能理解


也来看看。这是一个很好的库,它为您简化了这一过程,并且可以做更多的工作。

我认为您应该检查模块。它的流量控制功能将非常适合您:

User.getAll = function(uid, next){

    var user = {};
    var multi = client.multi();

    async.parallel([
        function(callback){
            // first task
            var key = 'user' + uid;
            client.hgetall(key, callback);
        },
        function(callback){
            // second task
            var key = 'products:' + uid;
            client.smembers(key, function(err, arr){
                if (err) return callback(err); // error check!!!
                key = key + ':';
                for (i=0; i < arr.length; i++){
                    multi.hgetall(key + arr[i]);
                }
                multi.exec(callback);
            })
        }
    ], function(err,res){
        // async callback
        if (err) return next(err); // error check!!!
        user.profile = res[0];
        user.products = res[1];
        return next(null, user);
    })
}
User.getAll=函数(uid,下一个){
var user={};
var multi=client.multi();
异步并行([
函数(回调){
//第一项任务
var key='user'+uid;
client.hgetall(key,callback);
},
函数(回调){
//第二项任务
var key='产品:'+uid;
client.smembers(键、函数(err、arr){
如果(错误)返回回调(错误);//错误检查!!!
键=键+':';
对于(i=0;i
Nice,将为此尝试async.parallel。