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
// 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}
});
});

View file

@ -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;
}

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 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);
});
}
});

View file

@ -1,3 +1,20 @@
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>
<% include header.ejs %>
<header>
<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 %>