summaryrefslogtreecommitdiff
path: root/app/index.js
diff options
context:
space:
mode:
authorSean Fridman <fridman@mail.sfsu.edu>2015-04-13 13:42:11 -0400
committerSean Fridman <fridman@mail.sfsu.edu>2015-04-13 13:42:11 -0400
commit5b7e5a133e5326a98b974b7e9e390ac393d1a05e (patch)
tree6a7fc0119f79b9467135fc0aac961e2409ddcbf0 /app/index.js
parent741bb035e10a1d89dfaa60ab79d25a63d2ff4726 (diff)
Client friendly error handling
Diffstat (limited to 'app/index.js')
-rw-r--r--app/index.js64
1 files changed, 57 insertions, 7 deletions
diff --git a/app/index.js b/app/index.js
index 719c424..419adfc 100644
--- a/app/index.js
+++ b/app/index.js
@@ -36,6 +36,7 @@ function OKCMS(options) {
var templateRoot = options.templateRoot || 'templates';
var adminTemplateRoot = options.templateRoot ||
path.join(__dirname, '../themes/okadmin/templates');
+ var debug = options.debug || false;
// Set metadata defaults
// TODO Abstract this out somewhere else
@@ -84,13 +85,17 @@ function OKCMS(options) {
});
var resourceCache = this._resourceCache =
this._createResources(resourceConfig, db, schemas);
+ var errorHandler = createErrorHandlerProducer(
+ templateProvider, adminTemplateProvider, debug);
// Create view instances from config
var views = this._views =
- this._createViews(viewConfig, db, meta, resourceCache, templateProvider);
+ this._createViews(viewConfig, db, meta, resourceCache, templateProvider,
+ errorHandler);
var adminViews = this._adminViews =
this._createAdminViews(adminPath, app, express, resourceConfig,
- resourceCache, adminTemplateProvider, adminMeta);
+ resourceCache, adminTemplateProvider, adminMeta,
+ errorHandler);
// Create services
var imageService = OKImageService({
@@ -109,7 +114,8 @@ function OKCMS(options) {
adminPath: adminPath,
services: {
image: imageService
- }
+ },
+ errorHandler: errorHandler
});
}
@@ -152,7 +158,7 @@ OKCMS.prototype._createResources = function(resourceConfig, db, schemaCache) {
};
OKCMS.prototype._createViews = function(viewConfig, db,
- meta, resourceCache, templateProvider) {
+ meta, resourceCache, templateProvider, errorHandler) {
viewConfig = viewConfig || {};
var self = this;
var createQueries = this._createQueries.bind(this);
@@ -171,7 +177,8 @@ OKCMS.prototype._createViews = function(viewConfig, db,
route: route,
template: template,
queries: queries,
- meta: meta
+ meta: meta,
+ errorHandler: errorHandler
});
return cache;
}, {});
@@ -193,7 +200,8 @@ OKCMS.prototype._createViews = function(viewConfig, db,
};
OKCMS.prototype._createAdminViews = function(path, app, express,
- resourceConfig, resourceCache, templateProvider, meta) {
+ resourceConfig, resourceCache, templateProvider, meta,
+ errorHandler) {
var views = {};
var withTrail = withTrailingSlash(path);
var withoutTrail = withoutTrailingSlash(path);
@@ -217,7 +225,8 @@ OKCMS.prototype._createAdminViews = function(path, app, express,
resourceConfig: resourceConfig,
resourceCache: resourceCache,
templateProvider: templateProvider,
- meta: meta
+ meta: meta,
+ errorHandler: errorHandler
});
return views;
};
@@ -269,6 +278,47 @@ ResourceCache.prototype.get = function(type, id) {
}
};
+/**
+ * Higher order function implementing customizable error handling
+ */
+function createErrorHandlerProducer(templateProvider, adminTemplateProvider, debugMode) {
+
+ var template404 = templateProvider.getTemplate('404') ||
+ adminTemplateProvider.getTemplate('404');
+ var template5xx = templateProvider.getTemplate('5xx') ||
+ adminTemplateProvider.getTemplate('5xx');
+
+ if (!template404 || !template5xx)
+ throw new Error('No error templates provided by admin theme or user')
+
+ return debugMode ? createDebugHandler : createErrorHandler;
+
+ function createErrorHandler(req, res, status) {
+ return function handleError(err) {
+ switch (status) {
+ case 404:
+ template404.render().then(function(rendered) {
+ res.status(status);
+ res.send(rendered);
+ });
+ break;
+ default:
+ template5xx.render().then(function(rendered) {
+ res.status(status);
+ res.send(rendered);
+ });
+ }
+
+ };
+ }
+
+ function createDebugHandler(req, res, status) {
+ return function handleError(err) {
+ res.send(err.stack);
+ };
+ }
+}
+
module.exports = {
createApp: function(options) {