← Усі задачіNode.js · Middle

Валідація тіла запиту

Напишіть validate(schema, body), що повертає масив помилок (порожній, якщо все гаразд). Правило поля: type ("string", "number", "boolean", "array"), required, min/max для чисел, minLength для рядків.

Тексти помилок: name: required (поле відсутнє чи 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, а поля, яких немає в схемі, - role: unknown field. Спершу помилки полів у порядку схеми, потім невідомі поля в порядку тіла. Якщо тіло - не об'єкт (рядок, масив, null), повертається ["body: must be an object"].

Тести (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']);