From a8fb2cd17d3b1be00b9810c7c0f222d4a2dbd129 Mon Sep 17 00:00:00 2001 From: Gabriel Tomitsuka Date: Thu, 16 Jul 2015 18:48:01 -0300 Subject: [PATCH 1/9] Adds custom `options.render` for rendering stuff --- index.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 0de7c6b..5fe8099 100644 --- a/index.js +++ b/index.js @@ -54,6 +54,8 @@ function finalhandler(req, res, options) { // get error callback var onerror = opts.onerror + var render = opts.render + return function (err) { var status = res.statusCode @@ -104,7 +106,12 @@ function finalhandler(req, res, options) { return req.socket.destroy() } - send(req, res, status, msg) + if(typeof render === 'function'){ + render(msg, function(rendered){ + send(req, res, status, rendered) + }); + }else + send(req, res, status, mst) } } From 00b3efc8f822de05e6d05f844e64274c35d45c6c Mon Sep 17 00:00:00 2001 From: Gabriel Tomitsuka Date: Thu, 16 Jul 2015 19:00:15 -0300 Subject: [PATCH 2/9] Update test.js --- test/test.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/test.js b/test/test.js index 55a5582..33e7f10 100644 --- a/test/test.js +++ b/test/test.js @@ -264,6 +264,17 @@ describe('finalhandler(req, res)', function () { }) }) }) + + describe('custom error view', function(){ + it('should render a custom view when option is set', function(done){ + var server = createServer(undefined, {render: function(message, res, done){ + done('

' + message + '

') + }}) + request(server) + .get('/') + .expect(new RegExp("^", "i"), done) + }) + }) }) function createServer(err, opts) { From b777a451ec19c9fd03165498249c65a6a6988bf2 Mon Sep 17 00:00:00 2001 From: Gabriel Tomitsuka Date: Thu, 16 Jul 2015 19:01:11 -0300 Subject: [PATCH 3/9] Update index.js --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 5fe8099..f2e6e90 100644 --- a/index.js +++ b/index.js @@ -107,7 +107,7 @@ function finalhandler(req, res, options) { } if(typeof render === 'function'){ - render(msg, function(rendered){ + render(res, msg, function(rendered){ send(req, res, status, rendered) }); }else From 2c1f257588afda2765c417e857258dddacca2237 Mon Sep 17 00:00:00 2001 From: Gabriel Tomitsuka Date: Thu, 16 Jul 2015 19:04:01 -0300 Subject: [PATCH 4/9] Update index.js --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index f2e6e90..6265d11 100644 --- a/index.js +++ b/index.js @@ -107,11 +107,11 @@ function finalhandler(req, res, options) { } if(typeof render === 'function'){ - render(res, msg, function(rendered){ + render(msg, req, res, function(rendered){ send(req, res, status, rendered) }); }else - send(req, res, status, mst) + send(req, res, status, msg) } } From 807f361fb741be64be8f8e63db4ea5349cc43f1a Mon Sep 17 00:00:00 2001 From: Gabriel Tomitsuka Date: Thu, 16 Jul 2015 19:08:21 -0300 Subject: [PATCH 5/9] Update README.md --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index 6b171d4..5bffd09 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ [![Test Coverage][coveralls-image]][coveralls-url] Node.js function to invoke as the final step to respond to HTTP request. +***Note:*** This is a fork maintained by [@gtomitsuka](https://github.com/gtomitsuka), and includes a `render` option, for custom rendering. ## Installation @@ -40,6 +41,10 @@ Provide a function to be called with the `err` when it exists. Can be used for writing errors to a central location without excessive function generation. Called as `onerror(err, req, res)`. +#### options.render + +Provide a function to be called for custom error message display. Called as `render(msg, req, res, done)`. + ## Examples ### always 404 @@ -117,6 +122,25 @@ function logerror(err) { } ``` +### render custom view on error +```js +var finalhandler = require('finalhandler') + +var server = http.createServer(function (req, res) { + var done = finalhandler(req, res, {render: function(msg, req, res, done){ + done(ejs.renderFile(__dirname + '/views/error.ejs', {msg: msg})) + }}) + + fs.readFile('index.html', function (err, buf) { + if (err) return done(err) + res.setHeader('Content-Type', 'text/html') + res.end(buf) + }) +}) + +server.listen(3000) +``` + ## License [MIT](LICENSE) From 40c1aca87039c95ef08cd4e542b6c6baf780f497 Mon Sep 17 00:00:00 2001 From: Gabriel Tomitsuka Date: Thu, 16 Jul 2015 19:13:10 -0300 Subject: [PATCH 6/9] Update test.js --- test/test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test.js b/test/test.js index 33e7f10..de3c4c1 100644 --- a/test/test.js +++ b/test/test.js @@ -267,8 +267,8 @@ describe('finalhandler(req, res)', function () { describe('custom error view', function(){ it('should render a custom view when option is set', function(done){ - var server = createServer(undefined, {render: function(message, res, done){ - done('

' + message + '

') + var server = createServer(undefined, {render: function(msg, req, res, done){ + done('

' + msg + '

') }}) request(server) .get('/') From 8d9b2c6e1a5499aa50f9726b58751a387d805817 Mon Sep 17 00:00:00 2001 From: Gabriel Tomitsuka Date: Thu, 16 Jul 2015 19:14:50 -0300 Subject: [PATCH 7/9] Update test.js --- test/test.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/test.js b/test/test.js index de3c4c1..6d70050 100644 --- a/test/test.js +++ b/test/test.js @@ -265,10 +265,12 @@ describe('finalhandler(req, res)', function () { }) }) - describe('custom error view', function(){ + describe('render', function(){ it('should render a custom view when option is set', function(done){ - var server = createServer(undefined, {render: function(msg, req, res, done){ - done('

' + msg + '

') + var err = new Error('boom!') + + var server = createServer(err, {render: function(msg, req, res, serverDone){ + serverDone('

' + msg + '

') }}) request(server) .get('/') From 0e466c41b25d251172a7f0dbef334bad65c3c8b9 Mon Sep 17 00:00:00 2001 From: Gabriel Tomitsuka Date: Thu, 16 Jul 2015 19:15:19 -0300 Subject: [PATCH 8/9] Update test.js --- test/test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test.js b/test/test.js index 6d70050..8e483d5 100644 --- a/test/test.js +++ b/test/test.js @@ -274,7 +274,8 @@ describe('finalhandler(req, res)', function () { }}) request(server) .get('/') - .expect(new RegExp("^", "i"), done) + .expect(new RegExp("^", "i")) + .expect(500, done) }) }) }) From 2746f2fde61dbd21e054161dbfdd568f02010154 Mon Sep 17 00:00:00 2001 From: Gabriel Tomitsuka Date: Thu, 16 Jul 2015 19:20:16 -0300 Subject: [PATCH 9/9] Proper naming is important --- test/test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test.js b/test/test.js index 8e483d5..8c857e9 100644 --- a/test/test.js +++ b/test/test.js @@ -269,8 +269,8 @@ describe('finalhandler(req, res)', function () { it('should render a custom view when option is set', function(done){ var err = new Error('boom!') - var server = createServer(err, {render: function(msg, req, res, serverDone){ - serverDone('

' + msg + '

') + var server = createServer(err, {render: function(msg, req, res, finished){ + finished('

' + msg + '

') }}) request(server) .get('/')