2014-01-26 64 views
3

我正在写在node.js的一个脚本,使用的Scripto,我试图做一个零检查,从数据库中值: 这里是js代码(节点) -如何使用redis-scripto和redis DB在NULL中检查null nil?

var redis = require("redis"); 
var redisClient = redis.createClient("6379","localhost"); 
var Scripto = require('redis-scripto'); 
var scriptManager = new Scripto(redisClient); 

var scripts = { 
    'test':'local function test(i) '+ 
    'if (i==nil) then return i end '+ 
    'local ch = redis.call("get", i) '+ 
    'if (ch==nil) then return ("ch is nil") '+ 
    'else return "1" '+ 
    'end end '+ 
    'return (test(KEYS[1]))', 
}; 

scriptManager.load(scripts); 
scriptManager.run('test', ["someInvalidKey"], [], function(err,result){ 
    console.log(err || result); 
}); 

但我无法进入“ch is nil”在if语句中...任何帮助?

回答

13

的Lua的片段:

redis.call("get", i) 

Redis的GET方法从不返回零,但它返回一个布尔值(假),如果没有键存在。

你的代码更改为:

local function test(i) 
    if (i==nil) then 
    return 'isnil ' .. i 
    end 
    local ch = redis.call("get", i) 
    if (ch==nil or (type(ch) == "boolean" and not ch)) then 
    return ("ch is nil or false") 
    else 
    return "isthere '" .. ch .. "'" 
    end 
end 
return (test(KEYS[1])) 

或者更简单(LUA平等不同类型之间的检查是允许的,总是返回false):

local function test(i) 
    if (i==nil) then 
    return 'isnil ' .. i 
    end 
    local ch = redis.call("get", i) 
    if (ch==false) then 
    return ("ch is false") 
    else 
    return "isthere '" .. ch .. "'" 
    end 
end 
return (test(KEYS[1])) 

如果你用它玩多一点,你会发现你可以比这更简单,但你会明白的。

希望这会有所帮助,TW

+0

非常感谢!有一些要点:) –

+0

不客气! –