Как вы используете lua в Redis, чтобы вернуть полезный результат в nodejs

один из модулей, которые я реализую для своего мобильного приложения API, должен получать все ожидающие уведомления от, отправляя имя пользователя.

я использовал список под названием имя пользователя: уведомления для хранения всех ожидающих идентификаторов уведомлений. Например, в моем тестовом случае ['9','10',11'] является результатом после вызова

lrange username:notifications 0 -1

Итак, я написал lua-скрипт для получения lrange и для каждого результата

hgetall notification:id 

И по какой-то причине lua не смог отправить таблицу, результат в nodejs в пригодном для использования состоянии. Интересно, есть ли у кого-нибудь решение для нескольких запросов hgetall и возврата их в nodejs

Вот остальная часть кода: -- @KEYS: "имя пользователя" -- @ARGV: имя пользователя

-- gets all fields from a hash as a dictionary
local hgetall = function (key)
  local bulk = redis.call('HGETALL', key)
    local result = {}
    local nextkey
    for i, v in ipairs(bulk) do
        if i % 2 == 1 then
            nextkey = v
        else
            result[nextkey] = v
        end
    end
end

local result = {}
local fields = redis.call('LRANGE' , ARGV[1], 0,-1) 

for i, field in ipairs(fields) do
  result[field] = hgetall('notification:'..field)   
end

return result

person jomaint    schedule 28.09.2014    source источник


Ответы (1)


Вы не можете вернуть «словарь» из сценария Lua, это недопустимый тип Redis (см. здесь) .

Вы можете сделать что-то вроде этого:

local result = {}

local fields = redis.call('LRANGE' , ARGV[1], 0, -1) 

for i=1,#fields do
    local t = hgetall('notification:' .. fields[i])
    result[#result+1] = fields[i]
    result[#result+1] = #t/2
    for j=1,#t do
        result[#result+1] = t[j]
    end
end

return result

Результатом является простой список в следующем формате:

[ field_1, nb_pairs_1, pairs..., field_2, nb_pairs_2, ... ]

Вам нужно будет расшифровать его в программе Node.

РЕДАКТИРОВАТЬ: есть другое решение, возможно, более простое в вашем случае: закодировать результат в JSON и вернуть его в виде строки.

Просто замените последнюю строку вашего кода на:

return cjson.encode(result)

и декодировать из JSON в вашем коде Node.

person catwell    schedule 28.09.2014
comment
Этот ответ был принят 3 октября, а вчера не принят. Это не работает для вас? - person catwell; 14.10.2014