PrettyError

A small tool to see node.js errors with less clutter:

... which is more readable compared to node's unformatted errors:

Installation
Install with npm:
npm install pretty-error
Usage and Examples
To see an error rendered with colors, you can do this:
var PrettyError = require('pretty-error');
var pe = new PrettyError();
var renderedError = pe.render(new Error('Some error message'));
console.log(renderedError);
Of course, you can render caught exceptions too:
try {
doSomethingThatThrowsAnError();
} catch (error) {
console.log(pe.render(error));
}
But if you wanna see all node errors with colors, there is a shortcut for it:
require('pretty-error').start(function(){
startTheApp();
});
... which is essentially equal to:
var PrettyError = require('pretty-error');
var pe = new PrettyError();
process.on('uncaughtException', function(error){
var rendered = pe.render(error);
console.error(rendered);
process.exit(1);
});
process.nextTick(function(){
startTheApp();
});
How it Works
PrettyError turns error objects into something similar to an html document, and then uses the upcoming RenderKid to render the document using simple html/css-like commands. This allows PrettyError to be themed using simple css-like declarations.
Theming
PrettyError's default theme is a bunch of simple css-like declarations. Here is the source of the default theme.
Surely, you can change all aspects of this theme. Let's do a minimal one:
pe = require('pretty-error').start();
pe.adppendStyle({
'pretty-error > header > title > kind': {
display: 'none'
},
'pretty-error > header > colon': {
display: 'none'
},
'pretty-error > header > message': {
color: 'bright-white',
background: 'cyan',
padding: '0 1'
},
'pretty-error > trace > item': {
marginLeft: 2,
bullet: '"<grey>o</grey>"'
},
'pretty-error > trace > item > header > pointer > file': {
color: 'bright-cyan'
},
'pretty-error > trace > item > header > pointer > colon': {
color: 'cyan'
},
'pretty-error > trace > item > header > pointer > line': {
color: 'bright-cyan'
},
'pretty-error > trace > item > header > what': {
color: 'bright-white'
},
'pretty-error > trace > item > footer > addr': {
display: 'none'
});
Here is how our minimal theme will look like:

I'll post more examples on RenderKid when it comes out of beta.
Customization
There are a few methods to help you customize the contents of your error logs.
Let's instantiate first:
PrettyError = require('pretty-error');
pe = new PrettyError();
pe = require('pretty-error').start();
Shortening paths
You might want to substitute long paths with shorter, more readable aliases:
pe.alias('E:/open-source/theatrejs/scripts/js', '(Theare.js)');
pe.removeAlias('E:/open-source/theatrejs/scripts/js');
pe.removeAllAliases();
Skipping packages
You might want to skip trace lines that belong to specific packages (chai, when, socket.io):
pe.skipPackage('chai', 'when', 'socket.io');
pe.unskipPackage('socket.io');
pe.unskipAllPackages();
Skipping node files
pe.skipNodeFiles();
pe.unskipNodeFiles();
Skipping paths
pe.skipPath('/home/dir/someFile.js');
pe.unskipPath('/home/dir/someFile.js');
pe.unskipAllPaths();
Skipping by callback
You can customize which trace lines get logged and which won't:
pe.skip(function(traceLine, lineNumber){
if (typeof traceLine.packageName !== 'undefined' && traceLine.packageName !== 'demo') {
return true;
}
});
pe.unskip(fn);
pe.unskipAll();
Modifying each trace line's contents
pe.filter(function(traceLine, lineNumber){
if (typeof traceLine.what !== 'undefined'){
traceLine.what = traceLine.what.replace(
/(.*\.module\.exports\.)(.*)/, '$2'
);
}
});
pe.removeFilter(fn);
pe.removeAllFilters();
Integrating with frameworks
PrettyError is very simple to set up, so it should be easy to use within other frameworks.
Integrating with express
Most frameworks such as express, catch errors automatically and provide a mechanism to handle those errors. Here is an example of how you can use PrettyError to log unhandled errors in express:
var express = require('express');
var PrettyError = require('pretty-error');
var app = express();
app.get('/', function(req, res) {
var a = b;
});
var server = app.listen(3000, function(){
console.log('Server started \n');
});
pe = new PrettyError();
app.use(function(err, req, res, next){
console.log(pe.render(err));
});
pe.skipNodeFiles();
pe.skipPackage('express');
State of the project
This project has been out there for a while and used by fellow devs, but I still consider it a work in progress. Please let me know if something isn't working, or if you have any suggestions. And pull requests are of course, very welcome!
P.S.
- If you're on windows, you can get better typography by using an alternative console. I use ConEmu.
- Also check out PrettyMonitor if you're using when.js. It's PrettyError wrapped to report unhandled when.js rejections.
License
MIT