Express validator - how to allow optional fields

28,532

Solution 1

You can use the optional method:

req.check('notexist', 'This works').optional().isInt();

This won't work if the field is an empty string "" or false or 0 for that you need to pass in checkFalsy: true .optional({checkFalsy: true})

An 422 status error will be thrown if you are only using .optional() & not passing any arguments.

Edit: See the docs here

Solution 2

As for express-validator 6 it's done like this:

check('email').isEmail().optional({nullable: true})

From documentation:

You can customize this behavior by passing an object with the following options:

nullable: if true, fields with null values will be considered optional

checkFalsy: if true, fields with falsy values (eg "", 0, false, null) will also be considered optional

More info about optional rule.

Solution 3

That's the expected behavior, yes. The assumption of validation is that you want to act on a value of a known key. To get what you want, you could do something like this:

if(req.param('mykey'))
  req.check('mykey', 'This failed').isInt();
Share:
28,532
cyberwombat
Author by

cyberwombat

My name is Yashua (@cyberwombat) and I am a full stack JS developer with a penchant for pixel perfect design and cutting edge tech. I am the cofounder and lead tech of LotusEngine, an automation and state machine platform. I thrive on co-creating and exploring potential ideas and helping people implement them whether through consultation or direct involvement. I am primarily based in Northern Arizona but travel often. I can equally assist you through online communication or meet you in person should our locations coincide.

Updated on October 10, 2021

Comments

  • cyberwombat
    cyberwombat over 2 years

    I am using express-validator version 2.3.0. It appears that fields are always required

    req.check('notexist', 'This failed').isInt();
    

    Will always fail - broken or am I missing something? There is a notEmpty method for required fields which seems to indicate the default is optional but I am not able to get the above to pass.