0

我正在检索 redis 哈希键的多个字段,HMGET以便使用 JSON 简单地发送它们:

redis.HMGET('key', 'name', 'date', // a lot more fields here,
    function(err, reply){
        res.jsonp({
            name: reply[0],
            date: reply[1],
            // other fields
        });
    }
);

使用大量字段会导致列表很长,因此代码的可读性较差。所以我想知道:有没有一种更美观、更通用的方式将reply数组映射到 JSON 响应对象 - 最好不必两次写下字段名称?

4

2 回答 2

0

It's unclear to me whether you are fetching all the properties of the hash, in which case you should use hgetall which returns an object. Otherwise, you want an interface looking something like this:

hmgetObject(redis)('key', 'name', 'date', ..., function (err, reply) {
  // Here, reply is already an object

  res.jsonp(reply);
});

You'll note how passing the redis client like this lets you easily reuse the function:

var hmget = hmgetObject(redis);

hmget('key1', 'name', 'date', ...);
hmget('key2', 'foo', 'bar', ...);

Here is the implementation, which is generic and works for an arbitrary number of arguments):

function hmgetObject (redis) {

  return function () {

    var args = [].slice.call(arguments, 0),
        cb = args.pop();

    args.push(map(args.slice(1), cb));
    redis.hmget.apply(redis, args);
  }

  function map (props, cb) {

    return function (err, vals) {

      if(err) return cb(err);

      var obj = {};
      for(var i = 0, l = props.length; i < l; i++) {
        obj[props[i]] = vals[i];
      }

      cb(null, obj);
    }
  }
}
于 2013-11-14T02:29:29.710 回答
0

您可以通过使用 HMGET 的包装函数来处理此问题,如下所示:

function localHMGET(key, res, fieldsArray) {
  var args = [key].concat(fieldsArray);
  args.push(function(err, reply) {
    var json = {};
    for (var i = 0; i < fieldsArray.lenth; i++) {
      json[fieldsArray[i]] = reply[i];
    }
    res.jsonp(json);
  });
  redis.HMGET.apply(this, args);
}

然后可以通过以下方式调用:

localHMGET('key', res, ['name', 'date' /* More fields */] );

我不知道这是否真的是您正在寻找的,但它会完成工作(如所述)。这将为 GET 调用手动创建参数,并且通过隔离 GET 中使用的键,您可以依靠它们将参数解压缩到“res”(我假设这里是预定义的对象)。

于 2013-11-14T01:59:51.927 回答