From 8d439c97fb6c080ba723970d0b8943d7c68e2689 Mon Sep 17 00:00:00 2001 From: Richard Pringle Date: Wed, 6 Apr 2016 17:56:14 -0400 Subject: [PATCH] Handle array of errors. --- lib/rest-adapter.js | 44 +++++++++++++++++++++++++++++++------------- test/rest.test.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 13 deletions(-) diff --git a/lib/rest-adapter.js b/lib/rest-adapter.js index 958e36e2..27a55074 100644 --- a/lib/rest-adapter.js +++ b/lib/rest-adapter.js @@ -369,22 +369,40 @@ RestAdapter.errorHandler = function(options) { res.statusCode = err.statusCode || err.status || 500; } - debug('Error in %s %s: %s', req.method, req.url, err.stack); - var data = { - name: err.name, - status: res.statusCode, - message: err.message || 'An unknown error occurred', - }; - - for (var prop in err) { - data[prop] = err[prop]; + if (Array.isArray(err)) { + var details = err.map(function(it) { + var data = generateResponseError(it); + delete data.statusCode; + return data; + }); + + var msg = 'Failed with multiple errors, see `details` for more information.'; + err = new Error(msg); + err.details = details; } - data.stack = err.stack; - if (process.env.NODE_ENV === 'production' || options.disableStackTrace) { - delete data.stack; + res.send({ error: generateResponseError(err) }); + + function generateResponseError(error) { + debug('Error in %s %s: %s', req.method, req.url, error.stack); + + var data = { + name: error.name, + status: res.statusCode, + message: error.message || 'An unknown error occurred', + }; + + for (var prop in error) { + data[prop] = error[prop]; + } + + data.stack = error.stack; + if (process.env.NODE_ENV === 'production' || options.disableStackTrace) { + delete data.stack; + } + + return data; } - res.send({ error: data }); } }; }; diff --git a/test/rest.test.js b/test/rest.test.js index c070500e..cd8c205b 100644 --- a/test/rest.test.js +++ b/test/rest.test.js @@ -1571,6 +1571,38 @@ describe('strong-remoting-rest', function() { .end(expectErrorResponseContaining({ message: 'an error' }, done)); }); + it('should return 500 if an array of errors is thrown', function(done) { + var testError = new Error('expected test error'); + var errArray = [testError, testError]; + + function method(error) { + return givenSharedStaticMethod(function(cb) { + cb(error); + }); + } + + request(app).get(method(testError).url) + .set('Accept', 'application/json') + .expect(500) + .end(function(err, res) { + if (err) return done(err); + expectedDetail = res.body.error; + delete expectedDetail.statusCode; + + request(app).get(method(errArray).url) + .set('Accept', 'application/json') + .expect(500) + .end(function(err, res) { + if (err) return done(err); + var error = res.body.error; + expect(error).to.have.property('message').that.match(/multiple errors/); + expect(error).to.include.keys('details'); + expect(error.details).to.include(expectedDetail); + done(); + }); + }); + }); + it('should return 500 if an error string is thrown', function(done) { remotes.shouldThrow = { bar: function(fn) {