diff --git a/lib/context.js b/lib/context.js index 8da7f55ce..894fa131d 100644 --- a/lib/context.js +++ b/lib/context.js @@ -143,16 +143,18 @@ const proto = module.exports = { // force text/plain this.type = 'text'; + let statusCode = err.status || err.statusCode; + // ENOENT support - if ('ENOENT' === err.code) err.status = 404; + if ('ENOENT' === err.code) statusCode = 404; // default to 500 - if ('number' !== typeof err.status || !statuses[err.status]) err.status = 500; + if ('number' !== typeof statusCode || !statuses[statusCode]) statusCode = 500; // respond - const code = statuses[err.status]; + const code = statuses[statusCode]; const msg = err.expose ? err.message : code; - this.status = err.status; + this.status = err.status = statusCode; this.length = Buffer.byteLength(msg); res.end(msg); }, diff --git a/test/context/onerror.js b/test/context/onerror.js index e4b8e6c80..4e59b5f3d 100644 --- a/test/context/onerror.js +++ b/test/context/onerror.js @@ -100,6 +100,48 @@ describe('ctx.onerror(err)', () => { .expect(200, () => {}); }); + it('should set status specified in the error using statusCode', () => { + const app = new Koa(); + + app.use((ctx, next) => { + ctx.body = 'something else'; + const err = new Error('Not found'); + err.statusCode = 404; + throw err; + }); + + const server = app.listen(); + + return request(server) + .get('/') + .expect(404) + .expect('Content-Type', 'text/plain; charset=utf-8') + .expect('Not Found'); + }); + + describe('when invalid err.statusCode', () => { + describe('not number', () => { + it('should respond 500', () => { + const app = new Koa(); + + app.use((ctx, next) => { + ctx.body = 'something else'; + const err = new Error('some error'); + err.statusCode = 'notnumber'; + throw err; + }); + + const server = app.listen(); + + return request(server) + .get('/') + .expect(500) + .expect('Content-Type', 'text/plain; charset=utf-8') + .expect('Internal Server Error'); + }); + }); + }); + describe('when invalid err.status', () => { describe('not number', () => { it('should respond 500', () => {