From 0cfa8f2792a151a163b8c5c854ce54e01e9171be Mon Sep 17 00:00:00 2001 From: analog-nico Date: Fri, 15 Apr 2016 22:41:26 -0700 Subject: [PATCH] feat: introduced TransformError for failed transforms --- lib/errors.js | 21 ++++++++++++++++++++- lib/rp.js | 2 +- test/spec/request-test.js | 22 ++++++++++++++++++++-- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/lib/errors.js b/lib/errors.js index 7967754..4cdd196 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -37,7 +37,26 @@ StatusCodeError.prototype = Object.create(Error.prototype); StatusCodeError.prototype.constructor = StatusCodeError; +function TransformError(cause, options, response) { + + this.name = 'TransformError'; + this.message = String(cause); + this.cause = cause; + this.error = cause; // legacy attribute + this.options = options; + this.response = response; + + if (Error.captureStackTrace) { // if required for non-V8 envs - see PR #40 + Error.captureStackTrace(this); + } + +} +TransformError.prototype = Object.create(Error.prototype); +TransformError.prototype.constructor = TransformError; + + module.exports = { RequestError: RequestError, - StatusCodeError: StatusCodeError + StatusCodeError: StatusCodeError, + TransformError: TransformError }; diff --git a/lib/rp.js b/lib/rp.js index 3ea968d..cc51d1a 100644 --- a/lib/rp.js +++ b/lib/rp.js @@ -68,7 +68,7 @@ function RP$callback(err, response, body) { try { self._rp_resolve(self._rp_options.transform(body, response, self._rp_options.resolveWithFullResponse)); } catch (e) { - self._rp_reject(e); + self._rp_reject(new errors.TransformError(e, self._rp_options, response)); } } else if (self._rp_options.resolveWithFullResponse) { self._rp_resolve(response); diff --git a/test/spec/request-test.js b/test/spec/request-test.js index dd8b422..39f9907 100644 --- a/test/spec/request-test.js +++ b/test/spec/request-test.js @@ -347,19 +347,37 @@ describe('Request-Promise', function () { it('that throws an exception', function () { + var cause = new Error('Transform failed!'); + var options = { url: 'http://localhost:4000/200', transform: function (body) { - throw new Error('Transform failed!'); + throw cause; } }; + var expectedOptions = { + url: 'http://localhost:4000/200', + simple: true, + resolveWithFullResponse: false, + transform: options.transform + }; + return rp(options) .then(function (transformedResponse) { throw new Error('Request should not have been fulfilled!'); }) .catch(function (err) { - expect(err.message).to.eql('Transform failed!'); + expect(err instanceof errors.TransformError).to.eql(true); + expect(err.name).to.eql('TransformError'); + expect(err.message).to.eql('Error: Transform failed!'); + expect(err.cause).to.eql(cause); + expect(err.error).to.eql(cause); + delete err.options.callback; // Even out Request version differences. + expect(err.options).to.eql(expectedOptions); + expect(err.response).to.be.an('object'); + expect(err.response.body).to.eql('GET /200'); + expect(err.response.statusCode).to.eql(200); }); });