diff --git a/lib/core/enhanceError.js b/lib/core/enhanceError.js index 8dfd5b45f8..05f0fc493c 100644 --- a/lib/core/enhanceError.js +++ b/lib/core/enhanceError.js @@ -17,5 +17,23 @@ module.exports = function enhanceError(error, config, code, request, response) { } error.request = request; error.response = response; + error.toJSON = function() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: this.config, + code: this.code + }; + }; return error; }; diff --git a/test/specs/core/createError.spec.js b/test/specs/core/createError.spec.js index b4e18f9d58..d78dc9a35e 100644 --- a/test/specs/core/createError.spec.js +++ b/test/specs/core/createError.spec.js @@ -12,4 +12,17 @@ describe('core::createError', function() { expect(error.request).toBe(request); expect(error.response).toBe(response); }); + it('should create an Error that can be serialized to JSON', function() { + // Attempting to serialize request and response results in + // TypeError: Converting circular structure to JSON + var request = { path: '/foo' }; + var response = { status: 200, data: { foo: 'bar' } }; + var error = createError('Boom!', { foo: 'bar' }, 'ESOMETHING', request, response); + var json = error.toJSON(); + expect(json.message).toBe('Boom!'); + expect(json.config).toEqual({ foo: 'bar' }); + expect(json.code).toBe('ESOMETHING'); + expect(json.request).toBe(undefined); + expect(json.response).toBe(undefined); + }); });