小编典典

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

redis

我有一个用户数据库:配置文件,产品,配置以及用户可以拥有的其他内容。我试图找出一种方法来成功链接我的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);
    }
}

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


阅读 405

收藏
2020-06-20

共1个答案

小编典典

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

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

显然,您将使用比然后更有意义的方法requests = ["first", "second"];,但我希望您有所想法。

还可以看看async.js。这是一个不错的库,可以为您简化此操作,并且可以做更多的事情。

2020-06-20