From 0e9cd935b965261c5f3691c3680d46a87d5e741f Mon Sep 17 00:00:00 2001 From: Joey Baker Date: Thu, 25 Aug 2016 21:28:23 -0700 Subject: [PATCH] Add: parse Sequelize errors This adds intelligence around sequelize errors to parse out the correct error status code and ensure it's always formatted as a Boom error. --- src/error.js | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/src/error.js b/src/error.js index 7cc8d87..af49e86 100644 --- a/src/error.js +++ b/src/error.js @@ -1,4 +1,4 @@ -import { wrap } from 'boom'; +import Boom from 'boom'; export default (target, key, descriptor) => { const fn = descriptor.value; @@ -7,21 +7,44 @@ export default (target, key, descriptor) => { try { await fn(request, reply); } catch (e) { - const { code, detail } = e.original; + if (e.original) { + const { code, detail } = e.original; - // pg error codes https://www.postgresql.org/docs/9.5/static/errcodes-appendix.html - if (code && (code.startsWith('22') || code.startsWith('23'))) { - const error = wrap(e, 406); + // pg error codes https://www.postgresql.org/docs/9.5/static/errcodes-appendix.html + if (code && (code.startsWith('22') || code.startsWith('23'))) { + const error = Boom.wrap(e, 406); - // detail tends to be more specific information. So, if we have it, use. - if (detail) { - error.message += `: ${detail}`; - error.reformat(); + // detail tends to be more specific information. So, if we have it, use. + if (detail) { + error.message += `: ${detail}`; + error.reformat(); + } + + reply(error); } + } else if (!e.isBoom) { + const { message } = e; + let err; - reply(error); + if (e.name === 'SequelizeValidationError') + err = Boom.badData(message); + else if (e.name === 'SequelizeConnectionTimedOutError') + err = Boom.gatewayTimeout(message); + else if (e.name === 'SequelizeHostNotReachableError') + err = Boom.serverUnavailable(message); + else if (e.name === 'SequelizeUniqueConstraintError') + err = Boom.conflict(message); + else if (e.name === 'SequelizeForeignKeyConstraintError') + err = Boom.expectationFailed(message); + else if (e.name === 'SequelizeExclusionConstraintError') + err = Boom.expectationFailed(message); + else if (e.name === 'SequelizeConnectionError') + err = Boom.badGateway(message); + else err = Boom.badImplementation(message); + + reply(err); } else { - reply(wrap(e)); + reply(e); } } }; -- 2.34.1