redis: - 获取密钥的修改设置值

时间:2013-11-28 08:44:07

标签: redis

以下代码会出错: -

redisClient.get('aKey', function(err, aValue){
    //some operations.
    redisClient.set('aKey', aDashValue, function(err){
    if(err){ throw err };
        console.log('redisClient set sessionKey');
    });
});

我想: - 1.获取密钥的价值。 2.修改值3.设定值。这3个步骤需要在移民继承中完成。

编辑:

SyntaxError: Unexpected token u
    at Object.parse (native)
    at /Users/apple/Documents/herokuApp/node_modules/connect-redis/lib/connect-redis.js:97:23
    at try_callback (/Users/apple/Documents/herokuApp/node_modules/redis/index.js:580:9)
    at RedisClient.return_reply (/Users/apple/Documents/herokuApp/node_modules/redis/index.js:670:13)
    at ReplyParser.<anonymous> (/Users/apple/Documents/herokuApp/node_modules/redis/index.js:312:14)
    at ReplyParse 

1 个答案:

答案 0 :(得分:0)

SyntaxError: Unexpected token u表示您正在尝试执行:

JSON.parse(undefined)
> SyntaxError: Unexpected token u

因为“aValue”在你的情况下返回undefined。即使你没有指定它,我推断你的代码是这样的:

redisClient.get('aKey', function(err, aValue){
    if(err){ throw err };
    var aDashValue = JSON.parse(avalue);
    // change a value
    aDashValue.attr = true;
    redisClient.set('aKey', JSON.stringify(aDashValue), function(err){
    if(err){ throw err };
        console.log('redisClient set sessionKey');
    });
});

因此,更通用的方法是:

/**
 * ChangeKeyValue
 * @param  {Object} redis redis client
 * @param  {String} key   key name
 * @param  {Function} fChanger(oldValue) -> {Object} change the attributes and returns an object
 * @param  {Function} f(err, replies) callback once done or on error)
 */
function changeKeyValue(redis, key, fChanger, f) {
  redis.watch(key, function(){

    redis.get(key, function(err, jsonStr) {
      var json;

      if (err) {
        return f(err)
      } else if(!jsonStr){
        return f(new Error("Key value is empty"));
      }

      try{
        json = JSON.parse(avalue);
      } catch(err){
        return f(err);
      }

      redis
        .multi()
        .set(key, JSON.stringify(fChanger(json)))
        .exec(f);
    });
  });
}

// Usage
changeKeyValue(redis, 'aKey', function(value){
  value.attr1 = "myNewValue";
  value.attr2++;
  return value;
}, function(err, replies){
  if(err){ throw err };
  console.log('redisClient set sessionKey');
});

但是,最好的方法仍然是使用HASH而不是STRING,特别是如果您使用JSON.parse / stringify来增加属性。