2
* Connect - errorHandler
3
* Copyright(c) 2010 Sencha Inc.
4
* Copyright(c) 2011 TJ Holowaychuk
12
var utils = require('../utils')
13
, url = require('url')
18
var env = process.env.NODE_ENV || 'development';
23
* Development error handler, providing stack traces
24
* and error message responses for requests accepting text, html,
29
* By default, and when _text/plain_ is accepted a simple stack trace
30
* or error message will be returned.
34
* When _application/json_ is accepted, connect will respond with
35
* an object in the form of `{ "error": error }`.
39
* When accepted connect will output a nice html stack trace.
45
exports = module.exports = function errorHandler(){
46
return function errorHandler(err, req, res, next){
47
if (err.status) res.statusCode = err.status;
48
if (res.statusCode < 400) res.statusCode = 500;
49
if ('test' != env) console.error(err.stack);
50
var accept = req.headers.accept || '';
52
if (~accept.indexOf('html')) {
53
fs.readFile(__dirname + '/../public/style.css', 'utf8', function(e, style){
54
fs.readFile(__dirname + '/../public/error.html', 'utf8', function(e, html){
55
var stack = (err.stack || '')
57
.map(function(v){ return '<li>' + v + '</li>'; }).join('');
59
.replace('{style}', style)
60
.replace('{stack}', stack)
61
.replace('{title}', exports.title)
62
.replace('{statusCode}', res.statusCode)
63
.replace(/\{error\}/g, utils.escape(err.toString()));
64
res.setHeader('Content-Type', 'text/html; charset=utf-8');
69
} else if (~accept.indexOf('json')) {
70
var error = { message: err.message, stack: err.stack };
71
for (var prop in err) error[prop] = err[prop];
72
var json = JSON.stringify({ error: error });
73
res.setHeader('Content-Type', 'application/json');
77
res.writeHead(res.statusCode, { 'Content-Type': 'text/plain' });
84
* Template title, framework authors may override this value.
87
exports.title = 'Connect';