Инкапсуляция Redis Hmset в функции сценария со льдом кофе

Я хочу инкапсулировать 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'] но так же, как аргументы: 'fooKey', 'fooValue', 'barKey', 'barValue', Но как передать их через упаковку exports.hmset функция, когда длина аргументов различна?

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам