← Alle AufgabenNode.js · Middle

Validierung des Request-Body

Schreib validate(schema, body), das ein Array von Fehlern liefert (leer, wenn alles stimmt). Eine Feldregel hat type ("string", "number", "boolean", "array"), required, min/max für Zahlen und minLength für Strings.

Fehlertexte: name: required (fehlend oder 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, und Felder, die nicht im Schema stehen, ergeben role: unknown field. Feldfehler kommen zuerst in der Reihenfolge des Schemas, dann unbekannte Felder in der Reihenfolge des Body. Ist der Body kein Objekt (ein String, ein Array, null), ist das Ergebnis ["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']);