ortense
9/14/2017 - 2:29 PM

Express Joi request validation

A simple way to validate request schema in express with Joi

const Joi = require('joi')

class ValidationError extends Error {
  constructor(joiError) {
    super('Request validation error')
    this.details = joiError.details
    this.type = this.name = this.constructor.name
    Object.defineProperties(this, {  
      type: { enumerable: true, writable: false },
      name: { enumerable: false, writable: false },
      message: { enumerable: true, writable: false }, 
     })
  }
}

module.exports = (schemas = {}) => (request, response, next) => {

  const requestSchema = Joi.object(schemas)

  const { error, value } = requestSchema.validate(request, { abortEarly: false })

  if (error) return next(new ValidationError(error))

  Object.keys(schemas).forEach(k => request[k] = value[k])

  return next()
}