【问题标题】:How to convert redis hashes to JSON?如何将redis哈希转换为JSON?
【发布时间】:2012-02-08 06:50:11
【问题描述】:

我正在使用 node_redis 为节点服务提供我从 redis 获得的对象的 JSON 表示。我认为这对你们很多人来说可能是相对基本的东西,但我很难过。我已经到了发送回复的地步之前我已经通过了所有的哈希并存储了它们。这是咖啡脚本:

    objects = []
    client.keys 'objects*', (err,keys) ->
      for key in keys
        client.hgetall key, (err,obj) ->
          objects.push obj
    response.end JSON.stringify objects

并生成 JavaScript:

      objects= [];
      client.keys('objects*', function(err, keys) {
        var key, _i, _len, _results;
        _results = [];
        for (_i = 0, _len = keys.length; _i < _len; _i++) {
          key = keys[_i];
          _results.push(client.hgetall(key, function(err, obj) {
            return objects.push(obj);
          }));
        }
        return _results;
      });
      return response.end(JSON.stringify(objects));

我不知道如何让我的代码在等待内部工作完成时放假。我怀疑有某种方法可以处理它,但我想不出任何东西。谢谢大家。

【问题讨论】:

    标签: node.js redis coffeescript


    【解决方案1】:

    所以你迭代 n 个键,然后在调用 client.keys 之后返回 JSON.stringify(objects) (这又会为每个键调用 client.hgetall?),但随后你返回 response.end(JSON .stringify(objects)) 在调用 client.keys 之后。

    问题很简单 - 您需要在附加来自 hgetkeys 的结果的函数内呈现响应,但只有在您看到来自 hgetkeys 的所有响应之后。

    我不是咖啡脚本爱好者,但这里有一个应该可以工作的 javascript 版本:

      objects= [];
      client.keys('objects*', function(err, keys) {
        var key, _i, _len, seen;
        seen = 0;
        for (_i = 0, _len = keys.length; _i < _len; _i++) {
          key = keys[_i];
          client.hgetall(key, function(err, obj) {
            objects.push(obj);
            seen++;
            if (seen == len) {
              return response.end(JSON.stringify(objects));
            }
          });
        }
      });
    

    我应该指出,这样做的一个缺点是,如果您从未从其中一个 hgetall 请求中获得响应,这将超时并且您将永远不会发出响应。更改存储哈希的方式可能会更好,这样您就可以一次获取所有值,或者在一定时间后调用一个函数来发出响应,这样您的客户端就不会永远等待。

    请问你为什么选择用coffeescript写这个?当它通过这样的翻译层时,编写节点似乎是一件非常头疼的事情。

    【讨论】:

    • 谢谢...这解决我的问题。我想有一些我错过的模式会延迟进一步的执行,直到一切都完成,但我之前错了很多次。关于“改变你存储哈希的方式”,我总是乐于接受建议。我刚从关系数据库领域中脱颖而出,我习惯于根据任意标准轻松抓取一堆“对象”。
    • 我在 redis 上花了很长时间,最初试图弄清楚如何构造我的数据,以便更容易查询。我发现自己用“内部”和“外部”异步函数编写了很多节点代码,然后在最后呈现响应。最终改变了我的模式,所以我可以提取数据,然后过滤它。不过,这取决于您的用例,这样做是有正当理由的。
    猜你喜欢
    • 2015-01-21
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2011-03-12
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多