0

HMGETJSONを使用して単純に送信するために、redisハッシュキーの複数のフィールドを取得しています:

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応答オブジェクトにマッピングするより美しく一般的な方法はありますか?フィールド名を2回書き留める必要はありませんか?

4

2 に答える 2

0

ハッシュのすべてのプロパティを取得しているかどうかは不明です。その場合hgetallは、オブジェクトを返す which を使用する必要があります。それ以外の場合は、次のようなインターフェイスが必要です。

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

  res.jsonp(reply);
});

次のように redis クライアントを渡すと、関数を簡単に再利用できることに注意してください。

var hmget = hmgetObject(redis);

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

これは一般的な実装で、任意の数の引数に対して機能します):

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 に答える