当前位置: 首页 > 面试题库 >

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

薛烈
2023-03-14
问题内容

我有一个用户数据库:配置文件,产品,配置以及用户可以拥有的其他内容。我试图找出一种方法来成功链接我的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 = 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。这是一个不错的库,可以为您简化此操作,并且可以做更多的事情。



 类似资料:
  • 下面的问题-我必须多次调用ajax函数,当所有函数完成后,将所有结果放入数组。我想到了这个: 在这里小提琴:http://jsfiddle.net/Fkd9n/ 一切似乎都很正常,“console.log(data)”用响应文本写出对象,但“console.log(val.name)”总是“未定义”。那么,一旦所有调用完成,如何将所有结果合并到一个数组中呢? 谢谢你!

  • 问题内容: 我没有特定的代码问题,但我不确定如何使用Scrapy框架从逻辑上解决以下问题: 我要抓取的数据结构通常是每个项目的表格行。简单明了吧? 最终,我想为每一行抓取Title,Due Date和Details。 标题和截止日期立即在页面上显示… 但是Details本身不在表格中,而是指向包含详细信息的页面的链接(如果没有意义,请使用表格): 即使在阅读了Scrapy文档的CrawlSpide

  • 我正在使用openLDAP服务器对我的夸克应用程序上的用户进行身份验证。一切正常,但我想检索我的用户数据。 我以为它会出现在方法身份中。getAttributes()但这给了我一个空映射。 以下是一个用户示例: 这也是我的ldap配置: 如何获取我的用户邮件和CN? 非常感谢您的帮助, 托马斯

  • 问题内容: 假设我要执行以下命令: 为了避免NullPointerException,如果发生以下情况,我将必须执行以下操作: 有没有一种方法或已经存在的Utils类可以更优雅地做到这一点,让我们说以下类似的东西? 问题答案: 最好的方法是 避免 连锁。如果您不熟悉Demeter法则(LoD),我认为应该这样做。您已经给出了一个完美的消息链示例,该消息链与没有业务知识的类过于亲密。 得墨meter

  • 问题内容: 我有一个标准的javascript ajax调用,其中将data:设置为json数据。 我试图在php中获取数据,这是行不通的。 但是,可行。 我想知道这可能是我的框架或诸如此类的无法正常工作的东西吗?还是还有其他我可以用来获取数据的东西? 编辑: 因此,框架YII和扩展Restfullyii具有使用一种方法获取其数据的方法return json_decode(file_get_con

  • 我正在运行一个Cordova应用程序,它连接到一个承载在Azure上的Web API。我已经使用Azure AD承载身份验证保护了API。当用户试图调用其中一个endpoint时,他会被转发到Azure广告登录页面,输入他的凭据,然后得到令牌。该令牌将添加到API的所有后续请求中。我正在使用mobile apps客户端SDK(cordova-plugin-ms-azure-mobile-apps)