diff --git a/README.md b/README.md index 6ffc055575..5cd5ec9965 100644 --- a/README.md +++ b/README.md @@ -277,7 +277,7 @@ Output: Multiple values in a hash can be set by supplying an object: client.HMSET(key2, { - "0123456789": "abcdefghij", + "0123456789": "abcdefghij", // NOTE: the key and value must both be strings "some manner of key": "a type of value" }); diff --git a/index.js b/index.js index b39ab4ef82..45b4c7ed02 100644 --- a/index.js +++ b/index.js @@ -898,6 +898,11 @@ RedisClient.prototype.hmset = function (args, callback) { for (i = 0, il = tmp_keys.length; i < il ; i++) { key = tmp_keys[i]; tmp_args.push(key); + if (typeof args[1][key] !== "string") { + var err = new Error("hmset expected value to be a string", key, ":", args[1][key]); + if (callback) return callback(err); + else throw err; + } tmp_args.push(args[1][key]); } args = tmp_args; diff --git a/test.js b/test.js index a84bdb9c72..037512669f 100644 --- a/test.js +++ b/test.js @@ -1348,6 +1348,24 @@ tests.OPTIONAL_CALLBACK_UNDEFINED = function () { client.get("op_cb2", last(name, require_string("y", name))); }; +tests.HMSET_THROWS_ON_NON_STRINGS = function () { + var name = "HMSET_THROWS_ON_NON_STRINGS"; + var hash = name; + var data = { "a": [ "this is not a string" ] }; + + client.hmset(hash, data, cb); + function cb(e, r) { + assert(e); // should be an error! + } + + // alternative way it throws + function thrower() { + client.hmset(hash, data); + } + assert.throws(thrower); + next(name); +}; + // TODO - need a better way to test auth, maybe auto-config a local Redis server or something. // Yes, this is the real password. Please be nice, thanks. tests.auth = function () {