diff --git a/src/cachers/redis.js b/src/cachers/redis.js index 39ccc2494..5d9dcbcb0 100644 --- a/src/cachers/redis.js +++ b/src/cachers/redis.js @@ -46,13 +46,13 @@ class RedisCacher extends BaseCacher { Redis = require("ioredis"); } catch(err) { /* istanbul ignore next */ - this.broker.fatal("The 'ioredis' package is missing! Please install it with 'npm install ioredis --save' command!", err, true); + this.broker.fatal("The 'ioredis' package is missing. Please install it with 'npm install ioredis --save' command.", err, true); } this.client = new Redis(this.opts.redis); this.client.on("connect", () => { /* istanbul ignore next */ - this.logger.info("Redis cacher connected!"); + this.logger.info("Redis cacher connected."); }); this.client.on("error", (err) => { @@ -98,7 +98,7 @@ class RedisCacher extends BaseCacher { try { return JSON.parse(data); } catch (err) { - this.logger.error("Redis result parse error!", err, data); + this.logger.error("Redis result parse error.", err, data); } } return null; @@ -139,7 +139,7 @@ class RedisCacher extends BaseCacher { this.logger.debug(`DELETE ${key}`); return this.client.del(this.prefix + key).catch(err => { /* istanbul ignore next */ - this.logger.error("Redis `del` error!", key, err); + this.logger.error("Redis `del` error.", key, err); }); } @@ -154,7 +154,7 @@ class RedisCacher extends BaseCacher { * @memberOf Cacher */ clean(match = "*") { - match = self.prefix + match.replace(/\*\*/g, "*"); + match = this.prefix + match.replace(/\*\*/g, "*"); this.logger.debug(`CLEAN ${match}`); let self = this; let scanDel = function (cursor, cb) { @@ -189,7 +189,7 @@ class RedisCacher extends BaseCacher { scanDel(0, (err) => { /* istanbul ignore next */ if (err) { - this.logger.error("Redis `scanDel` error!", match, err); + this.logger.error("Redis `scanDel` error.", match, err); } }); diff --git a/src/context.js b/src/context.js index 9d1fef091..afa1ff8ec 100644 --- a/src/context.js +++ b/src/context.js @@ -188,7 +188,7 @@ class Context { // Max calling level check to avoid calling loops if (this.broker.options.maxCallLevel > 0 && this.level >= this.broker.options.maxCallLevel) { - return Promise.reject(new MaxCallLevelError(this.broker.nodeID, { level: this.level, action: actionName })); + return Promise.reject(new MaxCallLevelError(this.broker.nodeID, this.level)); } return this.broker.call(actionName, params, opts); diff --git a/src/errors.js b/src/errors.js index fe42a0d7a..c506f49f4 100644 --- a/src/errors.js +++ b/src/errors.js @@ -225,23 +225,32 @@ class MaxCallLevelError extends MoleculerError { * Creates an instance of MaxCallLevelError. * * @param {String} nodeID - * @param {any} data + * @param {Number} level * * @memberOf MaxCallLevelError */ - constructor(nodeID, data) { - super(`Request level is reached the limit on '${nodeID}' node.`, 500, null, data); + constructor(nodeID, level) { + super(`Request level is reached the limit (${level}) on '${nodeID}' node.`, 500, null, { level }); this.retryable = false; } } /** - * Custom Moleculer Error class + * Custom Moleculer Error class for Service schema errors * * @class ServiceSchemaError * @extends {Error} */ -class ServiceSchemaError extends ExtendableError { +class ServiceSchemaError extends MoleculerError { + /** + * Creates an instance of ServiceSchemaError. + * + * @param {String} msg + * @memberof ServiceSchemaError + */ + constructor(msg) { + super(msg, 500, null); + } } /** diff --git a/src/service-broker.js b/src/service-broker.js index 595ebb75c..548b32776 100644 --- a/src/service-broker.js +++ b/src/service-broker.js @@ -737,7 +737,7 @@ class ServiceBroker { const epList = this.registry.getActionEndpoints(actionName); if (!epList) { this.logger.warn(`Service '${actionName}' is not registered.`); - return Promise.reject(new E.ServiceNotFoundError(actionName, this.broker.nodeID)); + return Promise.reject(new E.ServiceNotFoundError(actionName, this.nodeID)); } // Get the next available endpoint @@ -745,7 +745,7 @@ class ServiceBroker { if (!endpoint) { const errMsg = `Service '${actionName}' is not available.`; this.logger.warn(errMsg); - return Promise.reject(new E.ServiceNotAvailable(actionName, this.broker.nodeID)); + return Promise.reject(new E.ServiceNotAvailable(actionName, this.nodeID)); } return endpoint; } @@ -831,7 +831,7 @@ class ServiceBroker { const epList = this.registry.getActionEndpoints(actionName); if (epList == null) { this.logger.warn(`Service '${actionName}' is not registered.`); - return Promise.reject(new E.ServiceNotFoundError(actionName, this.broker.nodeID)); + return Promise.reject(new E.ServiceNotFoundError(actionName, this.nodeID)); } } } @@ -961,7 +961,7 @@ class ServiceBroker { let actions = this.registry.getActionEndpoints(actionName); if (actions == null || actions.localEndpoint == null) { this.logger.warn(`Service '${actionName}' is not registered locally.`); - return Promise.reject(new E.ServiceNotFoundError(actionName, this.broker.nodeID)); + return Promise.reject(new E.ServiceNotFoundError(actionName, this.nodeID)); } // Get local endpoint diff --git a/test/unit/context.spec.js b/test/unit/context.spec.js index 7e3ca664e..b2c736db1 100644 --- a/test/unit/context.spec.js +++ b/test/unit/context.spec.js @@ -153,7 +153,7 @@ describe("Test call method", () => { expect(broker.call).toHaveBeenCalledTimes(0); expect(err).toBeInstanceOf(MaxCallLevelError); expect(err.code).toBe(500); - expect(err.data.action).toBe("posts.find"); + expect(err.data).toEqual({ level: 5 }); }); }); }); diff --git a/test/unit/errors.spec.js b/test/unit/errors.spec.js index b9b684d65..51bec9ee9 100644 --- a/test/unit/errors.spec.js +++ b/test/unit/errors.spec.js @@ -61,26 +61,26 @@ describe("Test Errors", () => { }); it("test ServiceNotFoundError", () => { - let err = new errors.ServiceNotFoundError("posts.find"); + let err = new errors.ServiceNotFoundError("posts.find", "node-2"); expect(err).toBeDefined(); expect(err).toBeInstanceOf(Error); expect(err).toBeInstanceOf(errors.ServiceNotFoundError); expect(err.code).toBe(404); expect(err.name).toBe("ServiceNotFoundError"); - expect(err.message).toBe("Service 'posts.find' is not found!"); - expect(err.data).toEqual({ action: "posts.find" }); + expect(err.message).toBe("Service 'posts.find' is not found on 'node-2' node."); + expect(err.data).toEqual({ action: "posts.find", nodeID: "node-2" }); expect(err.retryable).toBe(false); }); it("test ServiceNotAvailable", () => { - let err = new errors.ServiceNotAvailable("posts.find"); + let err = new errors.ServiceNotAvailable("posts.find", "node-2"); expect(err).toBeDefined(); expect(err).toBeInstanceOf(Error); expect(err).toBeInstanceOf(errors.ServiceNotAvailable); expect(err.code).toBe(404); expect(err.name).toBe("ServiceNotAvailable"); - expect(err.message).toBe("Service 'posts.find' is not available!"); - expect(err.data).toEqual({ action: "posts.find" }); + expect(err.message).toBe("Service 'posts.find' is not available on 'node-2' node."); + expect(err.data).toEqual({ action: "posts.find", nodeID: "node-2" }); expect(err.retryable).toBe(false); }); @@ -91,7 +91,7 @@ describe("Test Errors", () => { expect(err).toBeInstanceOf(errors.ServiceNotAvailable); expect(err.code).toBe(404); expect(err.name).toBe("ServiceNotAvailable"); - expect(err.message).toBe("Service 'posts.find' is not available on 'server-2' node!"); + expect(err.message).toBe("Service 'posts.find' is not available on 'server-2' node."); expect(err.data).toEqual({ action: "posts.find", nodeID: "server-2" }); expect(err.retryable).toBe(false); }); @@ -104,7 +104,7 @@ describe("Test Errors", () => { expect(err).toBeInstanceOf(errors.RequestTimeoutError); expect(err.code).toBe(504); expect(err.name).toBe("RequestTimeoutError"); - expect(err.message).toBe("Request timed out when call 'posts.find' action on 'server-2' node!"); + expect(err.message).toBe("Request is timed out when call 'posts.find' action on 'server-2' node."); expect(err.data.nodeID).toBe("server-2"); expect(err.retryable).toBe(true); }); @@ -117,7 +117,7 @@ describe("Test Errors", () => { expect(err).toBeInstanceOf(errors.RequestSkippedError); expect(err.code).toBe(514); expect(err.name).toBe("RequestSkippedError"); - expect(err.message).toBe("Calling 'posts.find' is skipped because timeout reached on 'server-3' node!"); + expect(err.message).toBe("Calling 'posts.find' is skipped because timeout reached on 'server-3' node."); expect(err.data.action).toBe("posts.find"); expect(err.data.nodeID).toBe("server-3"); expect(err.retryable).toBe(false); @@ -139,25 +139,28 @@ describe("Test Errors", () => { }); it("test MaxCallLevelError", () => { - let err = new errors.MaxCallLevelError({ level: 10 }); + let err = new errors.MaxCallLevelError("server-2", 10); expect(err).toBeDefined(); expect(err).toBeInstanceOf(Error); expect(err).toBeInstanceOf(errors.MoleculerError); expect(err).toBeInstanceOf(errors.MaxCallLevelError); expect(err.code).toBe(500); expect(err.name).toBe("MaxCallLevelError"); - expect(err.message).toBe("Request level is reached the limit!"); + expect(err.message).toBe("Request level is reached the limit (10) on 'server-2' node."); expect(err.data).toEqual({ level: 10 }); expect(err.retryable).toBe(false); }); it("test ServiceSchemaError", () => { - let err = new errors.ServiceSchemaError("Invalid schema"); + let err = new errors.ServiceSchemaError("Invalid schema def."); expect(err).toBeDefined(); expect(err).toBeInstanceOf(Error); expect(err).toBeInstanceOf(errors.ServiceSchemaError); expect(err.name).toBe("ServiceSchemaError"); - expect(err.message).toBe("Invalid schema"); + expect(err.message).toBe("Invalid schema def."); + expect(err.code).toBe(500); + expect(err.type).toBeNull(); + expect(err.data).toBeUndefined(); }); it("test ProtocolVersionMismatchError", () => { @@ -167,7 +170,7 @@ describe("Test Errors", () => { expect(err).toBeInstanceOf(errors.ProtocolVersionMismatchError); expect(err.code).toBe(500); expect(err.name).toBe("ProtocolVersionMismatchError"); - expect(err.message).toBe("Protocol version mismatch!"); + expect(err.message).toBe("Protocol version mismatch."); expect(err.data).toEqual({ nodeID: "server-2", actual: "2", received: "1" }); expect(err.retryable).toBe(false); }); diff --git a/test/unit/service-broker.spec.js b/test/unit/service-broker.spec.js index 8b26ac3e2..0aaaf9c99 100644 --- a/test/unit/service-broker.spec.js +++ b/test/unit/service-broker.spec.js @@ -1155,8 +1155,8 @@ describe("Test broker._findNextActionEndpoint", () => { return broker._findNextActionEndpoint("posts.noaction").then(protectReject).catch(err => { expect(err).toBeDefined(); expect(err).toBeInstanceOf(ServiceNotFoundError); - expect(err.message).toBe("Service 'posts.noaction' is not found!"); - expect(err.data).toEqual({ action: "posts.noaction" }); + expect(err.message).toBe("Service 'posts.noaction' is not found on 'node-1234' node."); + expect(err.data).toEqual({ action: "posts.noaction", nodeID: broker.nodeID }); }); }); @@ -1165,8 +1165,8 @@ describe("Test broker._findNextActionEndpoint", () => { return broker._findNextActionEndpoint("posts.noHandler", {}).then(protectReject).catch(err => { expect(err).toBeDefined(); expect(err).toBeInstanceOf(ServiceNotAvailable); - expect(err.message).toBe("Service 'posts.noHandler' is not available!"); - expect(err.data).toEqual({ action: "posts.noHandler" }); + expect(err.message).toBe("Service 'posts.noHandler' is not available on 'node-1234' node."); + expect(err.data).toEqual({ action: "posts.noHandler", nodeID: broker.nodeID }); }); }); @@ -1174,7 +1174,7 @@ describe("Test broker._findNextActionEndpoint", () => { return broker._findNextActionEndpoint("posts.noHandler", { nodeID: "node-123"}).then(protectReject).catch(err => { expect(err).toBeDefined(); expect(err).toBeInstanceOf(ServiceNotFoundError); - expect(err.message).toBe("Service 'posts.noHandler' is not found on 'node-123' node!"); + expect(err.message).toBe("Service 'posts.noHandler' is not found on 'node-123' node."); expect(err.data).toEqual({ action: "posts.noHandler", nodeID: "node-123" }); }); }); @@ -1371,8 +1371,8 @@ describe("Test broker.callWithoutBalancer", () => { return broker.callWithoutBalancer("posts.noaction", {}).then(protectReject).catch(err => { expect(err).toBeDefined(); expect(err).toBeInstanceOf(ServiceNotFoundError); - expect(err.message).toBe("Service 'posts.noaction' is not found!"); - expect(err.data).toEqual({ action: "posts.noaction" }); + expect(err.message).toBe("Service 'posts.noaction' is not found on 'node-1234' node."); + expect(err.data).toEqual({ action: "posts.noaction", nodeID: broker.nodeID }); }); }); @@ -1778,8 +1778,8 @@ describe("Test broker._handleRemoteRequest", () => { return broker._handleRemoteRequest(ctx).then(protectReject).catch(err => { expect(err).toBeDefined(); expect(err).toBeInstanceOf(ServiceNotFoundError); - expect(err.message).toBe("Service 'posts.find' is not found!"); - expect(err.data).toEqual({ action: "posts.find", nodeID: undefined }); + expect(err.message).toBe("Service 'posts.find' is not found on 'node-1234' node."); + expect(err.data).toEqual({ action: "posts.find", nodeID: "node-1234" }); expect(broker._localCall).toHaveBeenCalledTimes(0); }); @@ -1794,8 +1794,8 @@ describe("Test broker._handleRemoteRequest", () => { return broker._handleRemoteRequest(ctx).then(protectReject).catch(err => { expect(err).toBeDefined(); expect(err).toBeInstanceOf(ServiceNotFoundError); - expect(err.message).toBe("Service 'posts.find' is not found!"); - expect(err.data).toEqual({ action: "posts.find", nodeID: undefined }); + expect(err.message).toBe("Service 'posts.find' is not found on 'node-1234' node."); + expect(err.data).toEqual({ action: "posts.find", nodeID: "node-1234" }); expect(broker._localCall).toHaveBeenCalledTimes(0); }); @@ -1897,7 +1897,7 @@ describe("Test broker._callErrorHandler", () => { it("should convert Promise.TimeoutError to RequestTimeoutError", () => { return broker._callErrorHandler(new Promise.TimeoutError, ctx, endpoint, {}).then(protectReject).catch(err => { expect(err).toBeInstanceOf(RequestTimeoutError); - expect(err.message).toBe("Request timed out when call 'user.create' action on 'server-2' node!"); + expect(err.message).toBe("Request is timed out when call 'user.create' action on 'server-2' node."); expect(broker.call).toHaveBeenCalledTimes(0); }); }); diff --git a/test/unit/transit.spec.js b/test/unit/transit.spec.js index 49ed4decd..0d52cfadc 100644 --- a/test/unit/transit.spec.js +++ b/test/unit/transit.spec.js @@ -320,7 +320,7 @@ describe("Test Transit.messageHandler", () => { //transit.deserialize = jest.fn(() => null); expect(() => { transit.messageHandler("EVENT"); - }).toThrow("Missing packet!"); + }).toThrow("Missing packet."); //transit.deserialize.mockReset(); });