// @flow import Sequelize from 'sequelize'; import { snakeCase } from 'lodash'; import { type Context } from 'koa'; export default function errorHandling() { return async function errorHandlingMiddleware( ctx: Context, next: () => Promise<*> ) { try { await next(); } catch (err) { ctx.status = err.status || 500; let message = err.message || err.name; let error; if (err instanceof Sequelize.ValidationError) { // super basic form error handling ctx.status = 400; if (err.errors && err.errors[0]) { message = `${err.errors[0].message} (${err.errors[0].path})`; } } if (message.match(/Not found/i)) { ctx.status = 404; error = 'not_found'; } if (message.match(/Authorization error/i)) { ctx.status = 403; error = 'authorization_error'; } if (ctx.status === 500) { message = 'Internal Server Error'; error = 'internal_server_error'; ctx.app.emit('error', err, ctx); } ctx.body = { ok: false, error: snakeCase(err.id || error), status: err.status, message, data: err.errorData ? err.errorData : undefined, }; } }; }