keystone
Version:
Web Application Framework and Admin GUI / Content Management System built on Express.js and Mongoose
106 lines (99 loc) • 3.37 kB
JavaScript
var dashes = '\n------------------------------------------------\n';
var utils = require('keystone-utils');
module.exports = function bindErrorHandlers (keystone, app) {
// Handle 404 (no route matched) errors
var default404Handler = function (req, res) {
if (req.headers.accept === 'application/json') {
return res.status(404).json({ error: 'not found' });
}
res.status(404).send(keystone.wrapHTMLError('Sorry, no page could be found at this address (404)'));
};
app.use(function (req, res, next) {
var err404 = keystone.get('404');
if (err404) {
try {
if (typeof err404 === 'function') {
return err404(req, res, next);
} else if (typeof err404 === 'string') {
if (req.headers.accept === 'application/json') {
return res.status(404).json({ error: 'not found' });
}
return res.status(404).render(err404);
} else {
if (keystone.get('logger')) {
console.log(dashes + 'Error handling 404 (not found): Invalid type (' + (typeof err404) + ') for 404 setting.' + dashes);
}
return default404Handler(req, res, next);
}
} catch (e) {
if (keystone.get('logger')) {
console.log(dashes + 'Error handling 404 (not found):');
console.log(e);
console.log(dashes);
}
return default404Handler(req, res, next);
}
} else {
return default404Handler(req, res, next);
}
});
// Handle other errors
var default500Handler = function (err, req, res, next) { // eslint-disable-line no-unused-vars
if (keystone.get('logger')) {
if (err instanceof Error) {
console.log((err.type ? err.type + ' ' : '') + 'Error thrown for request: ' + req.url);
} else {
console.log('Error thrown for request: ' + req.url);
}
console.log(err.stack || err);
}
// TODO: Take into account dev settings to send a more useful JSON error
if (req.headers.accept === 'application/json') {
return res.status(500).json({ error: 'unknown error' });
}
var msg = '';
if (keystone.get('env') === 'development') {
if (err instanceof Error) {
if (err.type) {
msg += '<h2>' + err.type + '</h2>';
}
msg += utils.textToHTML(err.message);
} else if (typeof err === 'object') {
msg += '<code>' + JSON.stringify(err) + '</code>';
} else if (err) {
msg += err;
}
}
return res.status(500).send(keystone.wrapHTMLError('Sorry, an error occurred loading the page (500)', msg));
};
app.use(function (err, req, res, next) {
var err500 = keystone.get('500');
if (err500) {
try {
if (typeof err500 === 'function') {
return err500(err, req, res, next);
} else if (typeof err500 === 'string') {
if (req.headers.accept === 'application/json') {
return res.status(500).json({ error: 'unknown error' });
}
res.locals.err = err;
return res.status(500).render(err500);
} else {
if (keystone.get('logger')) {
console.log(dashes + 'Error handling 500 (error): Invalid type (' + (typeof err500) + ') for 500 setting.' + dashes);
}
return default500Handler(err, req, res, next);
}
} catch (e) {
if (keystone.get('logger')) {
console.log(dashes + 'Error handling 500 (error):');
console.log(e);
console.log(dashes);
}
return default500Handler(err, req, res, next);
}
} else {
return default500Handler(err, req, res, next);
}
});
};