diff --git a/index.js b/index.js index bc23a5c..ee43444 100644 --- a/index.js +++ b/index.js @@ -36,7 +36,14 @@ module.exports = function onerror(app, options) { // wrap non-error object if (!(err instanceof Error)) { - const newError = new Error('non-error thrown: ' + err); + let errMsg = err; + if (typeof err === 'object') { + try { + errMsg = JSON.stringify(err); + // eslint-disable-next-line no-empty + } catch (e) {} + } + const newError = new Error('non-error thrown: ' + errMsg); // err maybe an object, try to copy the name, message and stack to the new error instance if (err) { if (err.name) newError.name = err.name; diff --git a/test/json.test.js b/test/json.test.js index 3507378..8163b79 100644 --- a/test/json.test.js +++ b/test/json.test.js @@ -71,7 +71,7 @@ describe('json.test.js', () => { .expect({ error: 'Internal Server Error' }, done); }); - it('should wrap non-error object', done => { + it('should wrap non-error primitive value', done => { const app = new koa(); app.on('error', () => {}); onerror(app); @@ -86,6 +86,21 @@ describe('json.test.js', () => { .expect({ error: 'non-error thrown: 1' }, done); }); + it('should wrap non-error object and stringify it', done => { + const app = new koa(); + app.on('error', () => {}); + onerror(app); + app.use(() => { + throw { error: true }; + }); + + request(app.callback()) + .get('/') + .set('Accept', 'application/json') + .expect(500) + .expect({ error: 'non-error thrown: {"error":true}' }, done); + }); + it('should wrap mock error obj instead of Error instance', done => { done = pedding(2, done); const app = new koa();