В своей работе я использую Hapi и Sequelize, и иногда мои ограничения sequelize (например, уникальные) не работают. Когда это произойдет, вы получите ошибку Boom по умолчанию для внутренних ошибок сервера и код состояния 500, и вот как вы можете преобразовать эти ошибки в ошибки Boom:
Вам нужно сделать только эти две вещи:
- Определите ловушку onPreResponse
- Преобразуйте ошибку и при необходимости верните новый объект или продолжите предыдущий запрос
Вот как может выглядеть окончательный код:
// Transform non-boom errors into boom ones server.ext('onPreResponse', (request, reply) => { // Transform only server errors if (request.response.isBoom && request.response.isServer) { reply(boomify(request.response)) } else { // Otherwise just continue with previous response reply.continue() } })
Источник функции boomify:
function boomify (error) { // I'm using globals for some things (like sequelize), you should replace it with your sequelize instance if (error instanceof Core.db.sequelize.UniqueConstraintError) { let be = Boom.create(400, `child "${error.errors[0].path}" fails because ["${error.errors[0].path}" must be unique]`) be.output.payload.validation = { source: 'payload', keys: error.errors.map(e => e.path) } return be } else { // If error wasn't found, return default boom internal error return Boom.internal('An internal server error', error) } }