A middleware for validating express inputs using Joi schemas using classes. Features include:
- Classes for validating input and output
- Replaces the incoming
req.body
,req.query
, etc and with the validated result object with specified class - Retains the original
req.body
inside a new property namedreq.original-body
.
You need to install joi
with this module since it relies on it in
peerDependencies
.
npm i express-joi-model joi --save
A JavaScript example can be found in the example/
folder of this repository.
const express = require('express')
const { BaseModel, putValidationMiddleware } = require('express-joi-model')
const Joi = require('joi')
const app = express()
class RequestModel extends BaseModel {
static get __schema() {
return {
a: Joi.number(),
b: Joi.string()
}
}
}
app.use(express.json())
app.post('/', putValidationMiddleware({ body: RequestModel }), function (req, res) {
console.log(req.body)
return res.json({ res: true })
})
app.listen(8080)
The library exports 3 variables - ValidationError
, BaseModel
, putValidationMiddleware
.
-
ValidationError
- the error thrown when validation of the object fails -
BaseModel
- the base class to inherit from when making your own model. -
putValidationMiddleware
- the function to generate the middleware using a config.
class ValidationError extends Error
It contains the error string
class BaseModel extends Object
The BaseModel class is to be used to create your own models. The class must have a static __schema
property that must be overriden and must return an Object
contains the appropriate keys and apt Joi
values.
Eg:
class RequestModel extends BaseModel {
static get __schema() {
return {
res: Joi.boolean(),
}
}
}
const resObj = RequestModel({res: true}) // VALID
const resObj2 = RequestModel({res: "123"}) // INVALID: throws ValidationError
This ensures that the object passed to RequestModel
class will follow the schema.
function putValidationMiddleware(cfg): function baseModelValidation(req, res, next)
Config can only have 4 keys that define what part of request has to be validated. The values have to be classes inherited from BaseModel:
-
body
-> validatesreq.body
and stores the validated object inreq.body
and the original body inreq.original_body
-
query
-> validatesreq.query
and stores the validated object inreq.query
and the original body inreq.query
-
params
-> validatesreq.params
and stores the validated object inreq.params
and the original body inreq.original_params
-
response
-> validates the response post return. The response has to be a json object. Returns 500 if response schema doesn't validate. The input validations return 400 if the input isn't valid.
Eg:
app.post('/correct', putValidationMiddleware({ body: RequestModel, response: ResponseModel }), function (req, res) {
console.log(req.body)
return res.json({ res: true })
})
- Better error handling + modification capabilities
- Better configurabilty for Joi in request and response