【问题标题】:lua redis string comparison not workinglua redis字符串比较不起作用
【发布时间】:2016-08-26 13:43:32
【问题描述】:
local password = json_string["password"] or "None"
local redisPassword = red:hmget(userName,"password") or None
local redisAuthtoken = red:hmget(userName,"authToken")
if (tostring(password)   ==  tostring(redisPassword))
then
    ngx.say(redisAuthtoken) 
else
    ngx.say("Error User or Service Not found 1510")
end 

密码 = 管理员 redisPassword = 管理员

我可以看到两个密码作为输出管理员,但它在 lua 代码中不匹配,并且控制总是转到其他部分。

当我这样比较时

if (tostring(password) == "admin" )

它工作正常,这意味着问题出在 redis 值上,但我在 redis 中设置了密码值 admin。

【问题讨论】:

  • 变量None包含什么?

标签: nginx lua redis string-comparison openresty


【解决方案1】:

我的理解是hmget返回multi-bulk reply,结果在一个lua表中,所以你可能应该这样做:

local res, err = red:hmget(userName,"password")
local redisPassword
if res and res ~= ngx.null then redisPassword = res[1] end
ngx.say(redisPassword)

来自documentation

一个非零 Redis “多批量回复”会导致一个 Lua 表包含所有组合值(如果有)。如果任何组成值是有效的 redis 错误值,那么它将是一个二元素表 {false, err}。一个 nil 多批量回复以 ngx.null 值返回。

请注意,ngx.null 的值与 Lua 的 nil 值不同,因此您可能需要单独检查。

另请注意,您在两个不同的地方使用None 作为变量和"None" 作为字符串,这可能与您期望的不同。

【讨论】:

  • 真棒thanx @Paul
猜你喜欢
  • 2011-09-20
  • 2014-04-03
  • 2012-01-22
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多