https://github.com/gsmithun4/expressjs-field-validator
Plugin for validating JSON request, middleware for expressjs
https://github.com/gsmithun4/expressjs-field-validator
data express-js expressjs json-request middleware nodejs request rest-api validation
Last synced: 6 months ago
JSON representation
Plugin for validating JSON request, middleware for expressjs
- Host: GitHub
- URL: https://github.com/gsmithun4/expressjs-field-validator
- Owner: gsmithun4
- Created: 2019-01-07T11:39:38.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2023-10-19T11:44:44.000Z (over 2 years ago)
- Last Synced: 2024-11-15T05:58:03.957Z (over 1 year ago)
- Topics: data, express-js, expressjs, json-request, middleware, nodejs, request, rest-api, validation
- Language: JavaScript
- Homepage:
- Size: 557 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# expressjs-field-validator
Request field validator for expressjs
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
[](https://sonarcloud.io/dashboard?id=gsmithun4_expressjs-field-validator)
- [Installation](#installation)
- [How To Use](#how-to-use)
- [Getting Started](#getting-started)
- [Defining a Field](#defining-a-field)
- [Available Options](#available-options)
- [isRequired()](#isrequired)
- [isArray()](#isarray)
- [isObject()](#isobject)
- [isNumber()](#isnumber)
- [isEmail()](#isemail)
- [isBoolean()](#isboolean)
- [isDate()](#isdate)
- [dateFormat(format)](#dateformatformat)
- [minimumNumber(min)](#minimumnumbermin)
- [maximumNumber(max)](#maximumnumbermax)
- [minimumLength(min)](#minimumlengthmin)
- [maximumLength(max)](#maximumlengthmax)
- [shouldInclude(inclues)](#shouldincludeinclues)
- [shouldExclude(excludes)](#shouldexcludeexcludes)
- [isMobileNumberWithCountryCode(countryCode)](#ismobilenumberwithcountrycodecountrycode)
- [isMobileNumberWithCountryCodeMandatory()](#ismobilenumberwithcountrycodemandatory)
- [isMobileNumberWithMinimumLength(min)](#ismobilenumberwithminimumlengthmin)
- [isMobileNumberWithMaximumLength(max)](#ismobilenumberwithmaximumlengthmax)
- [addChild(child)](#addchildchild)
- [addChildren(children)](#addchildrenchildren)
- [sendErrorMessage(message)](#senderrormessagemessage)
- [end() :bangbang::bangbang: Mandatory](#end-bangbangbangbang-mandatory)
- [Creating a validation middleware](#creating-a-validation-middleware)
- [Available Options](#available-options-1)
- [isToBeRejected()](#istoberejected)
- [isToBeForwarded()](#istobeforwarded)
- [checkService](#checkservice)
- [skipService](#skipservice)
- [sendErrorCode(errorCode)](#senderrorcodeerrorcode)
- [debug(isDebugEnabled)](#debugisdebugenabled)
- [addParams(paramList)](#addparamsparamlist)
- [done() :bangbang::bangbang: Mandatory](#done-bangbangbangbang-mandatory)
- [Dealing with nested objects](#dealing-with-nested-objects)
- [Request body](#request-body)
- [Validation](#validation)
## Installation
```
$ npm install expressjs-field-validator
```
## How To Use
```js
const {
validateBody,
validateParam,
validateQuery,
param,
} = require('expressjs-field-validator');
```
```js
router.post('/users/:id',
validateParam().addParams([
param('id').isNumber().end()
]).done(),
validateBody().addParams([
param('userId').isNumber().end()
]).done(),
validateQuery().addParams([
param('userName').isRequired().end()
]).done(),
validateHeader().addParams([
param('Authorization').isRequired().end()
]).done(),
(req, res, next) => {
// Main Service Here
});
```
## Getting Started
### Defining a Field
Use `param()` to define a field. It should end with `end()`
```js
param('userName').isRequired().end()
```
Defines a field `userName` which is mandatory.
#### Available Options
##### isRequired()
Field is mandatory
##### isArray()
Expects array
##### isObject()
Expects object
##### isNumber()
Expects number
##### isEmail()
Expects email
##### isBoolean()
Expects boolean value
##### isDate()
Expects a date with default format `YYYY-MM-DD`
##### dateFormat(format)
* `format` *Mandatory* String
specify date format, supported
```
YYYY-MM-DD
DD-MM-YYYY
MM-DD-YYYY
YYYY/MM/DD
DD/MM/YYYY
MM/DD/YYYY
```
##### minimumNumber(min)
* `min` *Mandatory* Number
Expects number and must be greater than or equal to `min`
##### maximumNumber(max)
* `max` *Mandatory* Number
Expects number and must be less than or equal to `max`
##### minimumLength(min)
* `min` *Mandatory* Number
Expects number/string and length must be less than or equal to `min`
##### maximumLength(max)
* `max` *Mandatory* Number
Expects number/string and length must be less than or equal to `max`
##### shouldInclude(inclues)
* `inclues` *Mandatory* Array
Expects number/string and must be one of given array `includes`
##### shouldExclude(excludes)
* `excludes` *Mandatory* Array
Expects number/string and must not be one of given array `excludes`
##### isMobileNumberWithCountryCode(countryCode)
* `countryCode` *Mandatory* String
Expects mobile number with or without `countryCode`
##### isMobileNumberWithCountryCodeMandatory()
Expects mobile number which should starts with the country code set with `isMobileNumberWithCountryCode`
##### isMobileNumberWithMinimumLength(min)
* `min` *Mandatory* Number
Minimum length of mobile number without country code
##### isMobileNumberWithMaximumLength(max)
* `max` *Mandatory* Number
Maximum length of mobile number without country code
##### customValidator(function)
* `function` *Mandatory* Function
A function with arguments (`value`, `req`, `error`)
`value` is the value of the field
`req` request object
`error` function with takes error message, should be called on error
```js
(value, req, error) => {
if (value !== 100) {
error('Invalid value customValidator');
}
}
```
##### addChild(child)
* `child` *Mandatory* field definition object
Add a child object for arrays and objects
##### addChildren(children)
* `children` *Mandatory* Array of field definition objects
Add a list of children objects for arrays and objects
##### sendErrorMessage(message)
* `message` *Mandatory* String
Custom message to be send back in case of validation failure
```js
// Default message
{
"error": [
{
"location": "body.sort",
"param": "sort",
"message": "Invalid Field Error"
}
]
}
// Custom message
{
"error": [
{
"location": "body.sort",
"param": "sort",
"message": ""
}
]
}
```
##### end() :bangbang::bangbang: Mandatory
Ends a param definition
### Creating a validation middleware
* `validateBody()` *Validate body*
* `validateParam()` *Validate param*
* `validateQuery()` *Validate query*
* `validateHeader()` *Validate header*
#### Available Options
##### isToBeRejected()
Defines the validation failure event - Server returns http status code set via `sendErrorCode` (default 422), :heavy_exclamation_mark: will not proceed to the next middleware
Response body
```js
{
"error": [
{
"location": "body.sort",
"param": "sort",
"message": "Invalid Field Error"
}
]
}
```
##### isToBeForwarded()
Defines the validation failure event - Error is set to `request.locals.data` and error code to `request.locals.statusCode`, :white_check_mark: will proceed to the next middleware
Error object
Response body
```js
{
"error": [
{
"location": "body.sort",
"param": "sort",
"message": "Invalid Field Error"
}
]
}
```
###### checkService
```js
const { checkService } = require('expressjs-field-validator');
```
Pass middleware to `checkService`, which must be skipped if `isToBeForwarded` enabled and validation errors are found
```js
router.get('/users/:id',
validateBody().isToBeForwarded().sendErrorCode(500).debug(false).addParams([
param('id').isRequired().isNumber().end()
]).done(),
checkService((req, res, next) => {
// This middleware is skipped if id is empty or not a number
}),
(req, res, next) => {
// This middleware Will not be skipped, error data will be availble here - req.locals.data and status code - request.locals.statusCode here
});
```
###### skipService
manually invoke forward mode, if this is set from any middleware, the middlewares wrapped inside `checkService` won't be executed
```js
const { skipService } = require('expressjs-field-validator');
```
```js
router.get('/users/:id',
(req, res, next) => {
skipService(req, 'SOME-ERROR');
next();
}),
checkService((req, res, next) => {
// This middleware is skipped
}),
(req, res, next) => {
// This middleware Will not be skipped, error data will be availble here - req.locals.data and status code - request.locals.statusCode here
});
```
##### sendErrorCode(errorCode)
* `errorCode` *Mandatory* Error code which should be rejected
##### debug(isDebugEnabled)
* `isDebugEnabled` *Mandatory* Pass `true` for development environments, the error object will contain more details about error
Error object
```js
{
"error": [
{
"location": "body.sort",
"param": "sort",
"message": "Invalid Field Error :: somevalueforsort Must Be A Boolean" // More details on error
}
]
}
```
##### addParams(paramList)
* `paramList` *Mandatory* Array of field definition objects
```js
validateBody().addParams([
// Add List of definition here
param('field1').isRequired().end(),
]).done()
```
Definintion of a field here : [Defining a Field](#defining-a-field)
##### done() :bangbang::bangbang: Mandatory
Ends a validation definition
## Dealing with nested objects
### Request body
```js
{
"field1": "Value", // String, Mandatory
"field2": [ // array, Mandatory
{ "field21": "44443" }, // object Optional, number mandatory
{ "field21": "44443" }
],
"field3": { // Object Optional
"field31": "true", // Boolean Mandatory
"field32": "String" // String Mandatory
},
"field4": [ // array, Mandatory
123, 445, 3434 // Number Optional
],
}
```
Should send http status code 500 in case of error
### Validation
```js
router.post('/users/:id',
validateBody().isToBeRejected().sendErrorCode(500).addParams([
param('field1').isRequired().end(), // Use end() to end a definition
param('field2').isRequired().isArray().isRequired().addChild(
param('field2-array').isObject().addChild( // field2-array is for tracking, you can give any name here
param('field21').isNumber().isRequired().end()
).end()
).end(),
param('field3').isObject().addChildren([
param('field31').isBoolean().isRequired().end(),
param('field32').isRequired().end()
]).end(),
param('field4').isRequired().isArray().isRequired().addChild(
param('field4-array').isNumber().end()
).end(),
]).done(), // Use done() to end a validation
validateParam().isToBeRejected().sendErrorCode(500).addParams([
param('field1').isRequired().end(), // Use end() to end a definition
]).done(), // Use done() to end a validation
// define validateQuery(),
// define validateHeader(),
(req, res, next) => {
// Main Service Here
});
```