Manage Validations with Node Input Validator in Node JS

Standard Way to Manage Validations in Node JS with Node Input Validator Package

Node JS - Education Funda
Node JS - Education Funda

As per standard code in node js we should prefer manage validations in separate directory and files it means we can create separate directory such as validations and inside it we can create index.js file which is common file and manage separate validation for each module such as userValidatoin.js, postValidation.js etc.



Something like this we can manage directory structure.

Let's go deep into code now:-

validations/index.js file:

const validator = require("node-input-validator")
const ResponseMiddleware = require("../middlewares/ResponseMiddleware")
const fn = require('../helpers/functions')

module.exports = {
//common function to send validation response
validate : (v, res, next, req = null) => {
console.log("ValidatorsIndex => validate")

if(v.check().then(function(matched){
if(!matched){ console.log('validate in')
req.code = 0
let message = fn.getErrorMessage(req, v.errors) //call custom method
req.statusCode = 400 //set bad request
req.status = false //set false
ResponseMiddleware(req, res, message)
}else{
console.log('validate out')
next()
}
}));
},

validations: {
general: {
requiredNumeric: "required|numeric",
required: "required",
nullable: "nullable",
requiredInt: "required|integer",
requiredString: "required|string|maxLength:255",
nullableString: "nullable|string|maxLength:255",
requiredText: "required|string|maxLength:5000",
requiredTodayOrAfterDate: "required|dateAfterToday:today,.|date",
requiredDate: "required|date",
nullableDate: "nullable|date",
},
active: "required|in:true,false",
userIdExists: "required|exists:users,id",
countryCode: "required|in:au,us,uk,us,nz",
mobile: "required|string|maxLength:15|minLength:8",
isdCode: "required|string|maxLength:5",
name: "required|string|maxLength:50",
email: "required|email|maxLength:50",
language: "required|string|in:en,hi",
password: "required|string|minLength:6",
newPassword: "required|string",
currentPassword: "required|string",
gender: "required|string",
dob: "required|date",
image: "nullable|string|maxLength:300",
uniqueMobile: "required|string|unique:users,mobile|maxLength:15|minLength:8",
existsMobile: "required|string|exists:users,mobile|maxLength:15|minLength:8",

uniqueEmail: "email|unique:users,email|maxLength:50",
uniqueNullableEmail: "nullable|email|unique:users,email|maxLength:50",
existsEmail: "email|exists:users,email|maxLength:50",
admin:{
email: "required|email",
password: "required|string",
albumId: "required|integer",
userId: "required|integer",
status: "required|integer",
about_us: "required|string",
privacy_policy: "required|string",
term_and_conditions: "required|string",
FAQs: "required|string"
}

}
}


now validations/userValidations.js file:

const { Validator } = require('node-input-validator')
const { validate, validations } = require("./index")

const signupValidator = async (req, res, next) => {

const v = new Validator(req.body, {
full_name: validations.name,
email: validations.email,
isd_code: validations.isdCode,
mobile: validations.mobile,
password: validations.password,
country_code: validations.countryCode
})

validate(v, res, next, req)
}

module.exports = {
signupValidator
}


Now we can call this validator function directly in our route file:

//post routes
router.post('/create', userValidation.signupValidator, userController.create);

Now let's add DB dynamic validations along with it such as email already exists, mobile already exists, etc:

We can add below code in our common validations/index.js file:
validator.extend("unique", async function({value, args}){
console.log("ValidatorsIndex => unique", args);

let result = null;

if(args.length > 2) {
result = await db[args[0]]
.findOne({
where : {
[args[1]]: value,
[args[2]]: { $not: args[3] }
}
})
} else {
result = await db[args[0]]
.findOne({
where : {
[args[1]]: value
}
})
}
return !result ? true : false;
})


uniqueEmail: "email|unique:kalkine_users,email|maxLength:50",

We can call it in validator like below easily:

const signupValidator = async (req, res, next) => {

const v = new Validator(req.body, {
full_name: validations.name,
email: validations.uniqueEmail,
})

validate(v, res, next, req)
}


I hope this blog will be helpful for you, thanks for reading this blog.

Happy Coding !

Comments

Popular posts from this blog

JavaScript Logical Output Based Interview Questions

Create and Deploy AWS SAM Application

Deploy Angular Build With Express JS Project