Skip to content

Commit

Permalink
Merge 2746f2f into fe4e4de
Browse files Browse the repository at this point in the history
  • Loading branch information
Gabriel Tomitsuka committed Jul 16, 2015
2 parents fe4e4de + 2746f2f commit 7724d54
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
9 changes: 8 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
}
}

Expand Down
14 changes: 14 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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('<!DOCTYPE html><html><body><p>' + msg + '<p></body></html>')
}})
request(server)
.get('/')
.expect(new RegExp("^<!DOCTYPE html>", "i"))
.expect(500, done)
})
})
})

function createServer(err, opts) {
Expand Down

0 comments on commit 7724d54

Please sign in to comment.