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) diff --git a/index.js b/index.js index 0de7c6b..6265d11 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, req, res, function(rendered){ + send(req, res, status, rendered) + }); + }else + send(req, res, status, msg) } } diff --git a/test/test.js b/test/test.js index 55a5582..8c857e9 100644 --- a/test/test.js +++ b/test/test.js @@ -264,6 +264,20 @@ describe('finalhandler(req, res)', function () { }) }) }) + + describe('render', 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, finished){ + finished('

' + msg + '

') + }}) + request(server) + .get('/') + .expect(new RegExp("^", "i")) + .expect(500, done) + }) + }) }) function createServer(err, opts) {