Ketav
Ketav

Reputation: 770

Not getting any response - Express Validator

I'm using the latest version of express-validator for validation. I'm not getting any response, However Old method i.e checkBody is working fine while new method i.e check('keyName') is not working properly.

Below is my code.

package.json

"express-validator": "^5.0.3",

routes.js

var authValidator = require('./../validation/auth.validation');
var routes = require('express').Router();

routes.post('/login', [
  authValidator.validateLogin, 
  authValidator.checkValidationResult ], function (req, res) {
     console.log('3');
     //res.send("Some other stuffs");
  }
);

module.exports = routes;

auth.validation.js

module.exports.validateLogin = validateLogin;
module.exports.checkValidationResult = checkValidationResult;

const {check, validationResult} = require('express-validator/check');
const {matchedData, sanitize} = require('express-validator/filter');

var response = require('./../general/MyResponse');
var messages = require('./../general/messages');

function validateLogin(req, res, next) {
  console.log('1');
  return [
    check('email').isLength({min: 1}).withMessage(messages.EMAIL_REQUIRED)
    .isEmail().withMessage(messages.INVALID_EMAIL),
    check('password').isLength({min: 1}).withMessage(messages.PASSWORD_REQUIRED),
  ]
}

function checkValidationResult(req, res, next) {
  console.log('2');
  var result = validationResult(req)
  if (!result.isEmpty()) {
    response.createResponse(
      res, 400,
      result.array()[0].msg,
      {'error': result.array()[0].msg}, {}
    )
  } else {
    next()
  }
}

I've noticed that node js not able to go ahead from the function validateLogin in auth.validation.js.

Can anyone tell me what's wrong with above code.

Inside console, Only 1 is displaying.

I'm attaching screenShot for referance.

screenShot of error

Upvotes: 1

Views: 1944

Answers (2)

Farhan Tahir
Farhan Tahir

Reputation: 2144

validateLogin and checkValidationResult are being applied as middlewares to your route. In middlewares you use next()method to call next middleware in the queue. Just like in your checkValidationResult.

In case of validateLogin, its not passing control to next middleware. But check method from express-validator v5 is itself a middleware method. Thus I guess it won't work correctly.

Please have a look at: https://github.com/ctavan/express-validator/issues/449

Try using following Code:

routes.js

var authValidator = require('./../validation/auth.validation');
var routes = require('express').Router();
var authValidations = authValidator.getAuthValidations();

routes.post('/login', 
  authValidations,
  authValidator.checkValidationResult, function (req, res) {
     console.log('3');
     //res.send("Some other stuffs");
  }
);

module.exports = routes;

auth.validations.js

module.exports.getAuthValidations = getAuthValidations;
module.exports.checkValidationResult = checkValidationResult;

const {check, validationResult} = require('express-validator/check');
const {matchedData, sanitize} = require('express-validator/filter');

var response = require('./../general/MyResponse');
var messages = require('./../general/messages');

function getAuthValidations(req, res, next) {
  return [
    check('email').isLength({min: 1}).withMessage(messages.EMAIL_REQUIRED)
    .isEmail().withMessage(messages.INVALID_EMAIL),
    check('password').isLength({min: 1}).withMessage(messages.PASSWORD_REQUIRED),
  ]
}

function checkValidationResult(req, res, next) {
  console.log('2');
  var result = validationResult(req)
  if (!result.isEmpty()) {
    response.createResponse(
      res, 400,
      result.array()[0].msg,
      {'error': result.array()[0].msg}, {}
    )
  } else {
    next()
  }
}

Upvotes: 1

Ketav
Ketav

Reputation: 770

We need to use simple Array and don't need to create function.

Follow this link Is it possible to do the validation in a separate file and not inline in the route? - GitHub for more details.

Code should be like this.

auth.validation.js

var response = require('./../general/MyResponse');
var messages = require('./../general/messages');

const {check, validationResult} = require('express-validator/check');
const {matchedData, sanitize} = require('express-validator/filter');

module.exports.validateLogin = [
    check('email').isLength({min: 1}).withMessage(messages.EMAIL_REQUIRED).isEmail().withMessage(messages.INVALID_EMAIL),
    check('password').isLength({ min: 1 }).withMessage(messages.PASSWORD_REQUIRED),
];

module.exports.checkValidationResult = checkValidationResult;

function checkValidationResult(req, res, next) {
    console.log('2');
    var result = validationResult(req)
    if (!result.isEmpty()) {
        response.createResponse(res, 400,
            result.array()[0].msg,
            {'error': result.array()[0].msg}, {}
        )
    } else {
        next()
    }
}

`

Upvotes: 4

Related Questions