koa-better-error-handler
A better error-handler for Koa v2+, built for CrocodileJS. Makes ctx.throw
beautiful again :sparkles:!
Index
Features
Install
npm install --save koa-better-error-handler
Usage
API
No support for sessions, cookies, or flash messaging:
import errorHandler from 'koa-better-error-handler';
import Koa from 'koa';
import Router from 'koa-router';
const app = new Koa();
app.context.onerror = errorHandler;
app.context.api = true;
const router = new Router();
router.get('/404', ctx => ctx.throw(404));
router.get('/500', ctx => ctx.throw(500));
app.use(router.routes());
app.use(async (ctx, next) => {
try {
await next();
if (ctx.status === 404)
ctx.throw(404);
} catch (err) {
ctx.throw(err);
ctx.app.emit('error', err, ctx);
}
});
app.listen(3000);
console.log('listening on port 3000');
Web App
Built-in support for sessions, cookies, and flash messaging:
import errorHandler from 'koa-better-error-handler';
import Koa from 'koa';
import redis from 'redis';
import RedisStore from 'koa-redis';
import session from 'koa-generic-session';
import flash from 'koa-connect-flash';
import convert from 'koa-convert';
import Router from 'koa-router';
const app = new Koa();
app.keys = [ 'foo', 'bar' ];
const redisClient = redis.createClient();
redisClient.on('connect', () => app.emit('log', 'info', 'redis connected'));
redisClient.on('error', err => app.emit('error', err));
const redisStore = new RedisStore({
client: redisClient
});
app.use(convert(session({
store: redisStore
})));
app.use(convert(flash()));
app.context.onerror = errorHandler;
const router = new Router();
router.get('/404', ctx => ctx.throw(404));
router.get('/500', ctx => ctx.throw(500));
app.use(router.routes());
app.use(async (ctx, next) => {
try {
await next();
if (ctx.status === 404)
ctx.throw(404);
} catch (err) {
ctx.throw(err);
ctx.app.emit('error', err, ctx);
}
});
app.listen(3000);
console.log('listening on port 3000');
User-Friendly Responses
Example Request:
curl -H "Accept: application/json" http://localhost/some-page-does-not-exist
Example Response:
{
"statusCode": 404,
"error": "Not Found",
"message":"Not Found"
}
HTML Error Lists
If you specify app.context.api = true
or set ctx.api = true
, and if a Mongoose validation error message occurs that has more than one message (e.g. multiple fields were invalid) – then err.message
will be joined by a comma instead of by <li>
.
Therefore if you DO want your API error messages to return HTML formatted error lists for Mongoose validation, then set app.context.api = false
, ctx.api = false
, or simply make sure to not set them before using this error handler.
With error lists:
{
"statusCode": 400,
"error": "Bad Request",
"message": "<ul class=\"text-xs-left mb-0\"><li>Path `company_logo` is required.</li><li>Gig description must be 100-300 characters.</li></ul>"
}
Without error lists:
{
"statusCode":400,
"error":"Bad Request",
"message":"Path `company_logo` is required., Gig description must be 100-300 characters."
}
License
MIT