node.js - 如何将 Redis 哈希值转换为 JSON?

标签 node.js redis coffeescript

我正在使用 node_redis 为 Node 服务提供我从 redis 获取的对象的 JSON 表示。我认为这对你们很多人来说可能是相对基本的东西,但我很难过。 我已经完成所有哈希并存储它们之前,我已经到了发送响应的地步。这是 CoffeeScript :

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

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

最佳答案

因此,您要遍历 n 个键,然后在调用 client.keys(它会依次为每个键调用 client.hgetall?)之后返回 JSON.stringify(objects),然后返回 response.end(JSON .stringify(objects)) 在调用 client.keys 之后。

问题很简单——您需要在追加 hgetkeys 结果的函数内呈现一个响应,但前提是您看到了 hgetkeys 的所有响应。

我不是 coffeescript 爱好者,但这里有一个应该可以工作的 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写这个?当 Node 要经过这样的翻译层时,编写 Node 似乎非常头疼。

关于node.js - 如何将 Redis 哈希值转换为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8827334/

相关文章:

javascript - CoffeeScript 中的 function.call

node.js - 文件太大错误处理 Nodejs Express Multer

elasticsearch - 如何配置redis在elk中充当消息队列,并在消息被消费时清理磁盘空间

jquery - 如何在 phantomJS 中执行 jQuery promise ?

data-structures - 格式良好的查询建议

ruby-on-rails - "You are connecting to Redis v3.2.9, Sidekiq requires Redis v4.0.0 or greater?"

javascript - 这两种声明原型(prototype)方法的方式有什么区别?

javascript - jquery 惯用的循环提前返回

javascript - Node : works fine in console but doesn't write to stream 中的事件流

javascript - 在 express 中设置静态 javascript 文件的内容类型