express-joi-model v1.3.1
express-joi-model
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.bodyinside a new property namedreq.original-body.
Install
You need to install joi with this module since it relies on it in
peerDependencies.
npm i express-joi-model joi --saveExample
A JavaScript example can be found in the example/ folder of this repository.
Usage (JavaScript)
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)API
The library exports 3 variables - ValidationError, BaseModel, putValidationMiddleware.
1. ValidationError - the error thrown when validation of the object fails
2. BaseModel - the base class to inherit from when making your own model.
3. putValidationMiddleware - the function to generate the middleware using a config.
ValidationError
class ValidationError extends ErrorIt contains the error string
BaseModel
class BaseModel extends ObjectThe 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 ValidationErrorThis ensures that the object passed to RequestModel class will follow the schema.
putValidationMiddleware
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:
1. body -> validates req.body and stores the validated object in req.body and the original body in req.original_body
2. query -> validates req.query and stores the validated object in req.query and the original body in req.query
3. params -> validates req.params and stores the validated object in req.params and the original body in req.original_params
4. 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 })
})Future TODO
- Better error handling + modification capabilities
- Better configurabilty for Joi in request and response