← All tasksNode.js · Middle

Request body validation

Write validate(schema, body) that returns an array of errors (empty when everything is fine). A field rule has type ("string", "number", "boolean", "array"), required, min/max for numbers and minLength for strings.

Error texts: name: required (missing or null), age: must be a number / tags: must be an array, age: must be >= 18, age: must be <= 99, name: must have at least 2 characters, and fields that aren't in the schema give role: unknown field. Field errors come first in schema order, then unknown fields in body order. If the body isn't an object (a string, an array, null), the result is ["body: must be an object"].

Tests (6)

  1. const schema = { name: { type: 'string', required: true, minLength: 2 }, age: { type: 'number', min: 0, max: 150 } };
    expect(validate(schema, { name: 'Ann', age: 30 })).toEqual([]);
    expect(validate(schema, { name: 'Ann' })).toEqual([]);
  2. const schema = { name: { type: 'string', required: true }, email: { type: 'string', required: true } };
    expect(validate(schema, {})).toEqual(['name: required', 'email: required']);
    expect(validate(schema, { name: null, email: 'a@b.c' })).toEqual(['name: required']);
  3. const schema = { age: { type: 'number' }, tags: { type: 'array' }, admin: { type: 'boolean' } };
    expect(validate(schema, { age: '30', tags: 'a,b', admin: 'yes' })).toEqual(['age: must be a number', 'tags: must be an array', 'admin: must be a boolean']);
    expect(validate(schema, { age: NaN })).toEqual(['age: must be a number']);
  4. const schema = { age: { type: 'number', min: 18, max: 99 }, name: { type: 'string', minLength: 2 } };
    expect(validate(schema, { age: 5, name: 'A' })).toEqual(['age: must be >= 18', 'name: must have at least 2 characters']);
    expect(validate(schema, { age: 120 })).toEqual(['age: must be <= 99']);
  5. const schema = { name: { type: 'string' } };
    expect(validate(schema, { name: 'Ann', role: 'admin', isAdmin: true })).toEqual(['role: unknown field', 'isAdmin: unknown field']);
  6. const schema = { name: { type: 'string' } };
    expect(validate(schema, null)).toEqual(['body: must be an object']);
    expect(validate(schema, [1, 2])).toEqual(['body: must be an object']);
    expect(validate(schema, 'text')).toEqual(['body: must be an object']);