2013-11-28 27 views
0

下面的代碼修改設定值給出錯誤: -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 
+0

而錯誤是...? –

+0

將其放入編輯。我無法追蹤錯誤的含義。有一個指揮問題的相關性。 –

+0

我想你的代碼中有一個異常,它不能轉化爲可以由「on error」處理程序處理的東西。我會刪除「if(err){throw err};」並在控制檯上顯示err。 –

回答

0

SyntaxError: Unexpected token u意味着你試圖執行:

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

,因爲 「安勤」 返回你的情況不確定。即使你沒有指定它,我推斷你的代碼是這樣的:

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來增加屬性。