Инкапсуляция 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" в вашем коде.