@akrdevtech/lib-express-joi-validation-middleware
Version:
Joi based validation middleware for ExpressJS
158 lines (136 loc) • 5.46 kB
Markdown
# Express Joi Validation Middleware
## Description
Implementation of [Joi](https://www.npmjs.com/package/joi) middleware for ExpressJS with TS.
- TypeScript support.
- Specify the order in which request inputs are validated.
## Quick Links
- [Example Usage (TypeScript)](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#Example-Usage-typescript)
- [Example Usage (JavaScript)](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#Example-Usage-javascript)
- [Behaviours](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#Behaviours)
- [Validation Ordering](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#validation-ordering)
- [Validation Options](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#validation-options)
## Usage
### Install
```sh
npm i @akrdevtech/lib-express-joi-validation-middleware
```
Peer Dependency
```sh
npm i express
```
### [](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#Example-Usage-(TypeScript)) Example Usage (TypeScript)
Validate `body`,`query`,`cookies`,`headers`&`params` at once using . Each of these may be optional as well.
```js script
import * as Joi from 'joi'
import * as express from 'express'
import { RequestValidator } from '@akrdevtech/lib-express-joi-validation-middleware';
const { validateAll } = new RequestValidator({ abortEarly: false }); // parameters of constructor is optional
const app = express()
const validateAllSchema: IValidateAllSchema = {
body: Joi.object({
someField: Joi.string().min(3).required(),
}),
query: Joi.object({
someField: Joi.string().min(3).required(),
}),
cookies: Joi.object({
someField: Joi.string().min(3).required(),
}),
headers: Joi.object({
someField: Joi.string().min(3).required(),
}),
params: Joi.object({
someField: Joi.string().min(3).required(),
}),
}
app.get('/', [
validateAll(validateAllSchema),
(req, res) => { res.send(`Hello World!`) }
]);
// with joi validation options
app.get('/with-joi-validation-option', [
validateAll(validateAllSchema,{ allowUnknown:true }),
(req, res) => { res.send(`Hello World!`) }
]);
const port = 8000;
app.listen(port, () => {console.log(`⚡️ Service started : PORT → ${port}}`);
```
### [](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#Example-Usage-(JavaScript)) Example Usage (JavaScript)
```js script
const Joi = require('joi')
const app = require('express')()
const { RequestValidator } = require('@akrdevtech/lib-express-joi-validation-middleware');
const {
validateAll,
validateBody,
validateCookies,
validateHeaders,
validateQuery,
validateParams
} = RequestValidator;
const validateAllSchema: IValidateAllSchema = {
body: Joi.object({
someField: Joi.string().min(3).required(),
}),
query: Joi.object({
someField: Joi.string().min(3).required(),
}),
cookies: Joi.object({
someField: Joi.string().min(3).required(),
}),
headers: Joi.object({
someField: Joi.string().min(3).required(),
}),
params: Joi.object({
someField: Joi.string().min(3).required(),
}),
}
const headerSchema = Joi.object({ someField: Joi.string().required() });
const bodySchema = Joi.object({ someField: Joi.string().required() });
const querySchema= Joi.object({ someField: Joi.string().required() });
const cookieSchema= Joi.object({ someField: Joi.string().required() });
const paramSchema= Joi.object({ someField: Joi.string().required() });
app.get('/', [
validateAll(validateAllSchema),
(req, res) => { res.send(`Hello World!`) }
]);
app.get('/separately', [
validateQuery(querySchema),
validateBody(bodySchema),
validateCookies(cookieSchema),
validateHeaders(headerSchema),
validateParams(paramSchema),
(req, res) => { res.send(`Hello World!`) }
]);
const port = 8000;
app.listen(port, () => {console.log(`⚡️ Service started : PORT → ${port}}`);
```
## [](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#Behaviours)Behaviours
### [](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#Validation-Ordering)Validation Ordering
Validation can be performed in a specific order using standard express middleware behaviour. Pass the middleware in the desired order.
Here's an example where the order is headers, body, query:
```js script
const headerSchema = Joi.object({ someField: Joi.string().required() });
const bodySchema = Joi.object({ someField: Joi.string().required() });
const querySchema= Joi.object({ someField: Joi.string().required() });
route.get('/', [
validateHeaders(headerSchema),
validateBody(bodySchema),
validateQuery(querySchema),
routeHandler
]);
```
### [](https://www.npmjs.com/package/@akrdevtech/lib-express-joi-validation-middleware#Validation-Options)Validation Options
Validation options can be extented with [`Joi.ValidationOptions`](https://joi.dev/api/?v=17.7.0#anyvalidatevalue-options).
Here’s an example where the order is headers, body, query:
```js script
const bodySchema = Joi.object({ someField: Joi.string().required() });
const options = {
abortEarly: false,
allowUnknown: true,
}
route.get('/', [
validateBody(bodySchema, options),
routeHandler
]);
```