Improved error handling

fixes #845

- only returns an error page for get requests, otherwise returns a response
- no more admin menu when not logged in
- no more error message about theme error template
- logWarn is available
This commit is contained in:
Hannah Wolfe 2013-10-17 22:49:14 +01:00
parent f12a3cecf7
commit 158d237122
2 changed files with 42 additions and 20 deletions

View File

@ -302,10 +302,10 @@ when(ghost.init()).then(function () {
// ### Error handling
// 404 Handler
server.use(errors.render404Page);
server.use(errors.error404);
// 500 Handler
server.use(errors.render500Page);
server.use(errors.error500);
// ## Routing

View File

@ -29,6 +29,26 @@ errors = {
throw err;
},
logWarn: function (warn, context, help) {
if ((process.env.NODE_ENV === 'development' ||
process.env.NODE_ENV === 'staging' ||
process.env.NODE_ENV === 'production')) {
console.log('\nWarning:'.yellow, warn.yellow);
if (context) {
console.log(context.white);
}
if (help) {
console.log(help.green);
}
// add a new line
console.log('');
}
},
logError: function (err, context, help) {
var stack = err ? err.stack : null;
err = err.message || err || 'Unknown';
@ -41,7 +61,7 @@ errors = {
console.error('\nERROR:'.red, err.red);
if (context) {
console.error(context);
console.error(context.white);
}
if (help) {
@ -133,7 +153,7 @@ errors = {
}
// Are we admin? If so, don't worry about the user template
if (res.isAdmin || userErrorTemplateExists === true) {
if ((res.isAdmin && req.session.user) || userErrorTemplateExists === true) {
return renderErrorInt();
}
@ -150,27 +170,29 @@ errors = {
return renderErrorInt();
}
// Message only displays the first time an error is triggered.
errors.logError(
"Theme error template not found",
null,
"Add an error.hbs template to the theme for customised errors."
);
renderErrorInt(defaultErrorTemplatePath);
});
},
render404Page: function (req, res, next) {
var message = res.isAdmin ? "No Ghost Found" : "Page Not Found";
this.renderErrorPage(404, message, req, res, next);
error404: function (req, res, next) {
var message = res.isAdmin && req.session.user ? "No Ghost Found" : "Page Not Found";
if (req.method === 'GET') {
this.renderErrorPage(404, message, req, res, next);
} else {
res.send(404, message);
}
},
render500Page: function (err, req, res, next) {
if (!err || !(err instanceof Error)) {
next();
error500: function (err, req, res, next) {
if (req.method === 'GET') {
if (!err || !(err instanceof Error)) {
next();
}
errors.renderErrorPage(500, err, req, res, next);
} else {
res.send(500, err);
}
errors.renderErrorPage(500, err, req, res, next);
}
};
@ -182,8 +204,8 @@ _.bindAll(
'logAndThrowError',
'logErrorWithRedirect',
'renderErrorPage',
'render404Page',
'render500Page'
'error404',
'error500'
);
module.exports = errors;