2013-09-08 2 views
0

Я хочу инкапсулировать redis hmset.incapsulating redis hmset в замороженном кофе скрипт функция

exports.hmset = (name, autocb, params...)=> 
    await client.hmset name, params, defer(err) 
    throw err if err 

У меня есть, что params является массив как ['fooKey', 'fooValue', 'barKey', 'barValue']. Но у меня есть данные в базе данных Redis на name ключе:

{'0' : 'fooKey', '1' : 'fooValue', '2' : 'barKey', '3': 'barValue'} 

Но я хочу, чтобы это было:

{'fooKey' : 'fooValue', 'barKey' : 'barValue'} 

Я понимаю, что я должен передать их в client.hmset не как массив ['fooKey', 'fooValue', 'barKey', 'barValue'], но только как args: 'fooKey', 'fooValue', 'barKey', 'barValue'. Но как передать их через обертку exports.hmset функция, когда длина аргументов различна?

ответ

1

Как я понимаю, вы используете соглашение о вызове hmset. Вы используете splat для сбора аргументов в массиве, а затем передаете массив как аргумент node_redis, который также поддерживает соглашение object, где вы передаете простой объект с ключами и их значениями. Вот почему вы получаете хэши redis с позиционными клавишами, так как если вы рассматриваете массив javascript как объект, это то, что у вас есть.

Что вам нужно сделать, это просто восклицательный знак в params снова при вызове Redis:

exports.hmset = (name, autocb, params...)=> 
    await client.hmset name, params..., defer(err) 
    throw err if err 

Теперь CoffeeScript будет проходить этот массив в качестве переменной длины к «реальным» hmset. В качестве дополнительного бонуса вы также можете использовать соглашение «params as object», которое, возможно, более элегантно.

0

Вы понимаете, что throw err не будет работать в IcedCoffeeScript, как вы ожидаете, что он будет работать? Это вызовет ошибку в цикле событий, так что вы не сможете поймать его с помощью «try» в вашем коде.

Смежные вопросы