Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save midnightcodr/c47a1c3322818e9ba42cd264b19885f6 to your computer and use it in GitHub Desktop.
Save midnightcodr/c47a1c3322818e9ba42cd264b19885f6 to your computer and use it in GitHub Desktop.
Error codes for Joi validation
// Based on https://stackoverflow.com/questions/48720942/node-js-joi-how-to-display-a-custom-error-messages
const Hapi = require('@hapi/hapi')
const Joi = require('@hapi/joi')
const Boom = require('@hapi/boom')
const server = Hapi.Server({
port: 3000,
routes: {
validate: {
options: {
abortEarly: false
},
failAction: (request, h, err) => {
const errorCodes = err.details
.map(e => e.context.errorCode)
.filter(e => e !== undefined)
throw Boom.badRequest(err.message, { errorCodes })
}
}
}
})
server.ext('onPreResponse', (request, h) => {
const response = request.response
if (!response.isBoom) {
return h.continue
}
const { data } = response
if (data !== undefined) {
response.output.payload = {
...response.output.payload,
...data
}
}
return h.continue
})
server.route([
{
method: 'POST',
path: '/person',
options: {
validate: {
payload: {
firstName: Joi.string()
.min(5)
.max(10)
.required()
.error(errors => {
errors.forEach(err => {
switch (err.type) {
case 'any.empty':
case 'any.required':
err.message = 'Firstname should not be empty!'
err.context = {
errorCode: 111
}
break
case 'string.min':
err.message = `Firstname should have at least ${
err.context.limit
} characters!`
err.context = {
errorCode: 121
}
break
case 'string.max':
err.message = `Firstname should have at most ${
err.context.limit
} characters!`
err.context = {
errorCode: 131
}
break
default:
break
}
})
return errors
}),
lastName: Joi.string()
.required()
.error(errors => {
errors.forEach(err => {
switch (err.type) {
case 'any.empty':
case 'any.required':
err.message = 'Lastname should not be empty!'
err.context = {
errorCode: 211
}
break
default:
break
}
})
return errors
})
}
}
},
handler: async request => {
console.log('to save', request.payload)
return { result: 'ok' }
}
}
])
const init = async () => {
await server.start()
console.log(`server serving at ${server.info.uri}`)
}
init()
// Based on https://stackoverflow.com/questions/48720942/node-js-joi-how-to-display-a-custom-error-messages
const Hapi = require('@hapi/hapi')
const Joi = require('@hapi/joi')
const Boom = require('@hapi/boom')
const server = Hapi.Server({
port: 3000,
routes: {
validate: {
failAction: (request, h, err) => {
const firstError = err.details[0]
if (firstError.context.errorCode !== undefined) {
throw Boom.badRequest(err.message, {
errorCode: firstError.context.errorCode
})
} else {
throw Boom.badRequest(err.message)
}
}
}
}
})
server.ext('onPreResponse', (request, h) => {
const response = request.response
if (!response.isBoom) {
return h.continue
}
const { data } = response
if (data !== undefined) {
response.output.payload = {
...response.output.payload,
...data
}
}
return response
})
server.route([
{
method: 'POST',
path: '/person',
options: {
validate: {
payload: {
firstName: Joi.string()
.min(5)
.max(10)
.required()
.error(errors => {
errors.forEach(err => {
switch (err.type) {
case 'any.empty':
case 'any.required':
err.message = 'Firstname should not be empty!'
err.context = {
errorCode: 111
}
break
case 'string.min':
err.message = `Firstname should have at least ${
err.context.limit
} characters!`
err.context = {
errorCode: 121
}
break
case 'string.max':
err.message = `Firstname should have at most ${
err.context.limit
} characters!`
err.context = {
errorCode: 131
}
break
default:
break
}
})
return errors
}),
lastName: Joi.string()
.required()
.error(errors => {
errors.forEach(err => {
switch (err.type) {
case 'any.empty':
case 'any.required':
err.message = 'Lastname should not be empty!'
err.context = {
errorCode: 211
}
break
default:
break
}
})
return errors
})
}
}
},
handler: async request => {
console.log('to save', request.payload)
return { result: 'ok' }
}
}
])
const init = async () => {
await server.start()
console.log(`server serving at ${server.info.uri}`)
}
init()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment