Better errors

This commit is contained in:
Jonathan Cremin 2014-12-05 17:40:07 +00:00
parent 61ed56d4f8
commit d48824ab49
4 changed files with 65 additions and 19 deletions

24
app.js
View file

@ -82,23 +82,25 @@ app.use(function(req, res, next) {
// development error handler // development error handler
// will print stacktrace // will print stacktrace
if (app.get('env') === 'development') { if (app.get('env') === 'development') {
app.use(function(err, req, res, next) { app.use(function(err, req, res, next) {
res.status(err.status || 500); res.status(err.status || 500);
res.render('error', { res.render('error', {
message: err.message, page: "error",
error: err message: err.message,
}); error: err
}); });
});
} }
// production error handler // production error handler
// no stacktraces leaked to user // no stacktraces leaked to user
app.use(function(err, req, res, next) { app.use(function(err, req, res, next) {
res.status(err.status || 500); res.status(err.status || 500);
res.render('error', { res.render('error', {
message: err.message, page: "error",
error: {} message: err.message,
}); error: {status: err.status || 500}
});
}); });

View file

@ -128,3 +128,18 @@ h3 {
height: 100%; height: 100%;
position: absolute; 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;
}

View file

@ -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 serviceId = req.params.service;
var type = req.params.type; var type = req.params.type;
var itemId = req.params.id; var itemId = req.params.id;
var promises = []; 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) { if (doc) {
res.render(type, {page: type, items: doc.items}); res.render(type, {page: type, items: doc.items});
} else { } 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) { for (var id in services) {
if (id != serviceId) { if (id != serviceId) {
promises.push(Q.timeout(services[id].search(item), 5000)); promises.push(Q.timeout(services[id].search(item), 5000));
@ -51,10 +56,17 @@ module.exports = function(req, res) {
}); });
items.unshift(item); 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; cache[serviceId][type + "-" + itemId] = items;
res.render(type, {page: type, items: 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);
}); });
} }
}); });

View file

@ -1,3 +1,20 @@
<h1><%= message %></h1> <% include header.ejs %>
<h2><%= error.status %></h2> <header>
<pre><%= error.stack %></pre> <div class="container">
<div class="row">
<div class="col-md-12">
<h1><a href="/">match<span class="audio-lighten">.audio</span></a></h1>
</div>
</div>
</div>
</header>
<div class="container main">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h2><%= error.status %></h2>
<h1><%= message %></h1>
<% if (error.stack) { %><pre><%= error.stack %></pre><% } %>
</div>
</div>
</div>
<% include footer.ejs %>