hapi-format-validation
This Hapi plugin formats validation errors in a way that is consistent, simple, and easy to render in client-side forms. Take your typical Joi validation error reply for instance...
hapi-format-validation
😿
Before statusCode: 400 error: 'Bad Request' // this message should get formatted before displaying it to a user message: 'child "name" fails because ["name" is not allowed to be empty]. child "email" fails because ["email" must be a valid email]' validation: source: 'payload' // extra work required of the client to link these keys to error messages :( keys: 'name' 'email'
hapi-format-validation
😍
After statusCode: 400 error: 'Bad Request' // a newline-separated string, ready-to-use if necessary message: '"name" is not allowed to be empty↵"email" must be a valid email' validation: source: 'payload' // a simple key-value mapping of fields and their errors errors: name: '"name" is not allowed to be empty' email: '"email" must be a valid email'
Installation
$ npm install --save hapi-format-validation
Usage
const FormatValidation = ; server;
Options
stripQuotes
: (optional) iftrue
, strips double quotation marks from around the path name in error messagescapitalize
: (optional) iftrue
, capitalizes the first letter of each error messagesequelize
: (optional) pass aSequelize
instance to format unique key violations (more information below)
Sequelize integration
hapi-format-validation
also handles Sequelize unique key violation errors, which would otherwise be a 500 Internal Server Error
. Pass your Sequelize
instance (sold separately) as an option to the plugin when you register it to enable this feature.
const FormatValidation = ;const Sequelize = ; const sequelize = ...; server;
Before
statusCode: 500 error: 'Internal Server Error' message: 'An internal server error occurred'
After
'statusCode': 400 'error': 'Bad Request' 'message': '"username" must be unique' 'validation': 'source': 'payload' 'errors': 'username': '"username" must be unique'
Acknowledgements 👊
- joi-errors-for-forms for the validation payload format inspiration
- This article by Andrey Viktorov for the idea around using the
onPreResponse
hook and checking for Sequelize errors