From 40c037eaf44084fbdf586ad3ca545c564a877e19 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Fri, 18 Sep 2015 06:28:14 +0200 Subject: [PATCH] Add redis error codes to the errors --- index.js | 7 +++++++ test/commands/eval.spec.js | 6 +++++- test/commands/keys.spec.js | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 4e88b40228..bd71db1866 100644 --- a/index.js +++ b/index.js @@ -500,12 +500,19 @@ RedisClient.prototype.connection_gone = function (why) { this.retry_timer = setTimeout(retry_connection, this.retry_delay, this); }; +var err_code = /^([A-Z]+)\s+(.+)$/; RedisClient.prototype.return_error = function (err) { var command_obj = this.command_queue.shift(), queue_len = this.command_queue.length; if (command_obj.command && command_obj.command.toUpperCase) { err.command_used = command_obj.command.toUpperCase(); } + var match = err.message.match(err_code); + // LUA script could return user errors that don't behave like all other errors! + if (match) { + err.code = match[1]; + } + if (this.pub_sub_mode === false && queue_len === 0) { this.command_queue = new Queue(); this.emit("idle"); diff --git a/test/commands/eval.spec.js b/test/commands/eval.spec.js index a22098e333..234547cd48 100644 --- a/test/commands/eval.spec.js +++ b/test/commands/eval.spec.js @@ -52,7 +52,11 @@ describe("The 'eval' method", function () { it('converts lua error to an error response', function (done) { helper.serverVersionAtLeast.call(this, client, [2, 5, 0]); - client.eval("return {err='this is an error'}", 0, helper.isError(done)); + client.eval("return {err='this is an error'}", 0, function(err) { + assert(err.code === undefined); + helper.isError()(err); + done(); + }); }); it('represents a lua table appropritely', function (done) { diff --git a/test/commands/keys.spec.js b/test/commands/keys.spec.js index 60c1e84404..58159072f6 100644 --- a/test/commands/keys.spec.js +++ b/test/commands/keys.spec.js @@ -14,6 +14,9 @@ describe("The 'keys' method", function () { var client; beforeEach(function (done) { + args = args || {}; + // This is going to test if the high water is also respected + args.command_queue_high_water = 100; client = redis.createClient.apply(redis.createClient, args); client.once("connect", function () { client.flushdb(done);