Skip to content

Instantly share code, notes, and snippets.

@TheDeveloper
Last active July 24, 2017 17:44
Show Gist options
  • Save TheDeveloper/d64e58e678ea4727be23d9c4a10926cd to your computer and use it in GitHub Desktop.
Save TheDeveloper/d64e58e678ea4727be23d9c4a10926cd to your computer and use it in GitHub Desktop.
Node module for Redis hmsetex command
/**
* npm install --save lodash redis node-redis-scripty
*
* Usage:
* let hmsetex = require('./hmsetex.js')
* let key = 'your-key';
* let fields = { some_field: 'test', another_field: 'foo' };
* hmsetex(key, fields).then(handleResult).catch(handleError);
*/
const _ = require('lodash');
let Scripty = require('node-redis-scripty');
let redis = require('redis');
let yourRedisClient = redis.createClient();
let scripty = new Scripty(yourRedisClient);
const hmsetexsrc = `
local key = KEYS[1]
local args = ARGV
local call = redis.call
if call("EXISTS", key) == 0 then
return nil
end
return call("HMSET", key, unpack(args))
`;
module.exports = function(key, fields) {
return new Promise((resolve, reject) => {
scripty.loadScript('hmsetex', hmsetexsrc, (err, script) => {
if (err) return reject(err);
// Make sure any null values are set to '' for redis
Object.keys(fields).forEach(k => {
if (fields[k] === null) fields[k] = '';
});
let args = _.flatten(_.toPairs(fields));
let numKeys = 1;
script.run(numKeys, key, ...args, (err, result) => err ? reject(err) : resolve(result));
});
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment