我正在使用HMGET
检索redis哈希键的多个字段,只需使用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响应对象 - 最好不必两次写下字段名称?
答案 0 :(得分: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'(我假设这是一个预定义的对象)。
答案 1 :(得分:0)
我不清楚你是否正在获取哈希的所有属性,在这种情况下你应该使用返回一个对象的hgetall
。否则,您希望界面看起来像这样:
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);
}
}
}