Nandor Krizbai
Nandor Krizbai

Reputation: 123

AJV validation in Nodejs

I am getting an error if the allRequired keyword is set. If it's not given there is no error. The documentation says this keyword must to be given to object types. When it's not given the validation passes even for wrong input (tested via Postman)

Here is the schema, it's exported from another file:

const ticketSchema = {
  type: 'object',
  properties: {
    firstName: {
      type: 'string',
      minLength: 1,
    },
    lastName: {
      type: 'string',
      minLength: 1,
    },
    ticketId: {
      type: 'string',
      minLength: 6,
      maxLength: 6,
    },
  },
  allRequired: true,         // <---- error occurs here
};

export default ticketSchema;

Error message:

Error: strict mode: unknown keyword: "allRequired"

Validation

const ajv = new Ajv();
const validateTicket = ajv.compile(ticketSchema);
const ticket = {
    'first-name': firstName,
    'last-name': lastName,
    'route-id': routeID,
  };

const valid = validateTicket(ticket);
if (!valid) {
  res.status(422).send(validateTicket.errors);
  return;
}

Upvotes: 0

Views: 1315

Answers (2)

Nandor Krizbai
Nandor Krizbai

Reputation: 123

Update

There were other mistakes too. The key names must be the same as given in the scheme, otherwise the validation won't work.

Example:

const scheme = {
  type: 'object',
  properties: {
    firstName: {
      type: 'string',
    },
    lastName: {
      type: 'string',
    },
  },
};

// correct - key names are the same
data = {
  firstName: 'Alex',
  lastName: 'Smith',
};

// incorrect - key names aren't the same
data = {
  'first-name': 'Alex',
  'last-name': 'Smith',
};

Upvotes: 0

There is no allRequired property in JSON schema. I looked for it up here in specification. It is not there. So, which documentation do you refer to?

There is no allRequired property as far as I know.

But, if you want to make all the properties required, you need to specify a property called required. It is an array with required field names as elements. So, in your case, it would be:

const ticketSchema = {
  type: 'object',
  properties: {
    firstName: {
      type: 'string',
      minLength: 1,
    },
    lastName: {
      type: 'string',
      minLength: 1,
    },
    ticketId: {
      type: 'string',
      minLength: 6,
      maxLength: 6,
    },
  },
  required: ['firstName', 'lastName', 'ticketId']
};

Update:

allRequired is not part of JSON specification. It is part of ajv-keywords module. You need to initialize it as follows:

const Ajv = require('ajv');
const ajv = new Ajv();
require('ajv-keywords')(ajv);

const validateTicket = ajv.compile(ticketSchema);
const ticket = {
    'first-name': firstName,
    'last-name': lastName,
    'route-id': routeID,
  };

const valid = validateTicket(ticket);
if (!valid) {
  res.status(422).send(validateTicket.errors);
  return;
}

Upvotes: 1

Related Questions