diff --git a/lib/errors/error.js b/lib/errors/error.js new file mode 100644 index 00000000..0b9d66c4 --- /dev/null +++ b/lib/errors/error.js @@ -0,0 +1,12 @@ +function AsanaError(message) { + this.message = message; + try { + throw new Error(message); + } catch (e) { + this.stack = e.stack; + } +} + +AsanaError.prototype = Object.create(Error.prototype); + +module.exports = AsanaError; \ No newline at end of file diff --git a/lib/errors/forbidden.js b/lib/errors/forbidden.js index 8e71b29f..e4ac4f12 100644 --- a/lib/errors/forbidden.js +++ b/lib/errors/forbidden.js @@ -1,8 +1,8 @@ var util = require('util'); +var AsanaError = require('./error'); function Forbidden(value) { - Error.call(this); - this.message = 'Forbidden'; + AsanaError.call(this, 'Forbidden'); this.status = 403; this.value = value; } diff --git a/lib/errors/invalid_request.js b/lib/errors/invalid_request.js index 8abb3f1b..a5da4203 100644 --- a/lib/errors/invalid_request.js +++ b/lib/errors/invalid_request.js @@ -1,8 +1,8 @@ var util = require('util'); +var AsanaError = require('./error'); function InvalidRequest(value) { - Error.call(this); - this.message = 'Invalid Request'; + AsanaError.call(this, 'Invalid Request'); this.status = 400; this.value = value; } diff --git a/lib/errors/no_authorization.js b/lib/errors/no_authorization.js index 46dfabf6..ee9d76a8 100644 --- a/lib/errors/no_authorization.js +++ b/lib/errors/no_authorization.js @@ -1,8 +1,8 @@ var util = require('util'); +var AsanaError = require('./error'); function NoAuthorization(value) { - Error.call(this); - this.message = 'No Authorization'; + AsanaError.call(this, 'No Authorization'); this.status = 401; this.value = value; } diff --git a/lib/errors/not_found.js b/lib/errors/not_found.js index a59b4ece..93c77a06 100644 --- a/lib/errors/not_found.js +++ b/lib/errors/not_found.js @@ -1,8 +1,8 @@ var util = require('util'); +var AsanaError = require('./error'); function NotFound(value) { - Error.call(this); - this.message = 'Not Found'; + AsanaError.call(this, 'Not Found'); this.status = 404; this.value = value; } diff --git a/lib/errors/rate_limit_enforced.js b/lib/errors/rate_limit_enforced.js index 031c94dd..b156dcb8 100644 --- a/lib/errors/rate_limit_enforced.js +++ b/lib/errors/rate_limit_enforced.js @@ -1,9 +1,9 @@ var util = require('util'); +var AsanaError = require('./error'); function RateLimitEnforced(value) { /* jshint camelcase:false */ - Error.call(this); - this.message = 'Rate Limit Enforced'; + AsanaError.call(this, 'Rate Limit Enforced'); this.status = 429; this.value = value; this.retryAfterSeconds = value && parseInt(value.retry_after, 10); diff --git a/lib/errors/server_error.js b/lib/errors/server_error.js index 452e285e..5ef84402 100644 --- a/lib/errors/server_error.js +++ b/lib/errors/server_error.js @@ -1,8 +1,8 @@ var util = require('util'); +var AsanaError = require('./error'); function ServerError(value) { - Error.call(this); - this.message = 'Server Error'; + AsanaError.call(this, 'Server Error'); this.status = 500; this.value = value; } diff --git a/test/dispatcher_spec.js b/test/dispatcher_spec.js index b6f9e39e..fa490bd5 100644 --- a/test/dispatcher_spec.js +++ b/test/dispatcher_spec.js @@ -104,6 +104,10 @@ describe('Dispatcher', function() { return res.then(function() { throw new Error('Should not have reached here'); }, function(passedErr) { + // Compare everything but stack + assert(passedErr.stack); + delete passedErr.stack; + delete err.stack; return assert.deepEqual(passedErr, err); }); });