From d48824ab49296fbbe03e315eda21f7e38c6f120a Mon Sep 17 00:00:00 2001 From: Jonathan Cremin Date: Fri, 5 Dec 2014 17:40:07 +0000 Subject: [PATCH] Better errors --- app.js | 24 +++++++++++++----------- public/stylesheets/style.css | 15 +++++++++++++++ routes/share.js | 22 +++++++++++++++++----- views/error.ejs | 23 ++++++++++++++++++++--- 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/app.js b/app.js index 135d947..7c1e72c 100644 --- a/app.js +++ b/app.js @@ -82,23 +82,25 @@ app.use(function(req, res, next) { // development error handler // will print stacktrace if (app.get('env') === 'development') { - app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: err - }); + app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + page: "error", + message: err.message, + error: err }); + }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: {} - }); + res.status(err.status || 500); + res.render('error', { + page: "error", + message: err.message, + error: {status: err.status || 500} + }); }); diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 30ff136..7c805ce 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -128,3 +128,18 @@ h3 { height: 100%; position: absolute; } + +.error h1, .error h2 { + font-weight: 300; + text-align: center; +} + +.error .main h1 { + font-size: 2em; + margin-bottom: 50px; +} + +.error h2 { + font-size: 4em; + margin-top: 50px; +} diff --git a/routes/share.js b/routes/share.js index 38de097..c0c6de0 100644 --- a/routes/share.js +++ b/routes/share.js @@ -15,18 +15,23 @@ require("fs").readdirSync(path.join(__dirname, "..", "lib", "services")).forEach }); -module.exports = function(req, res) { +module.exports = function(req, res, next) { var serviceId = req.params.service; var type = req.params.type; var itemId = req.params.id; var promises = []; - req.db.matches.findOne({item_id:serviceId + itemId}).then(function(doc) { + if (!services[serviceId] || (type != "album" && type != "track")) { + next(); + return; + } + + + req.db.matches.findOne({_id:serviceId + itemId}).then(function(doc) { if (doc) { res.render(type, {page: type, items: doc.items}); } else { - services[serviceId].lookupId(itemId, type).then(function(item) { - + Q.timeout(services[serviceId].lookupId(itemId, type), 5000).then(function(item) { for (var id in services) { if (id != serviceId) { promises.push(Q.timeout(services[id].search(item), 5000)); @@ -51,10 +56,17 @@ module.exports = function(req, res) { }); items.unshift(item); - req.db.matches.save({item_id:serviceId + itemId, items:items}); + req.db.matches.save({_id:serviceId + itemId, items:items}); cache[serviceId][type + "-" + itemId] = items; res.render(type, {page: type, items: items}); }); + }, function(err) { + var error = new Error("An unexpected error happenend") + if (err.code == "ETIMEDOUT") { + error = new Error("Error talking to music service"); + error.status = "502"; + } + next(error); }); } }); diff --git a/views/error.ejs b/views/error.ejs index 7cf94ed..f7ea6f0 100644 --- a/views/error.ejs +++ b/views/error.ejs @@ -1,3 +1,20 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
+<% include header.ejs %> +
+
+
+ +
+
+
+
+
+
+

<%= error.status %>

+

<%= message %>

+ <% if (error.stack) { %>
<%= error.stack %>
<% } %> +
+
+
+<% include footer.ejs %>