以下代码会出错: -
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)
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来增加属性。