Проверка схемы JSON с идеальными сообщениями

Я разделил ввод данных в вызове REST на 4 части. Данные могут быть отправлены на вызов REST через: -

  1. заголовки
  2. параметры запроса
  3. параметры пути
  4. тело запроса

Итак, чтобы проверить наличие любого ключа в любой из четырех вышеупомянутых частей, я создал схему в этом формате. Поэтому, если мне нужно проверить что-либо в параметрах запроса, я добавлю ключ 'query', а затем добавлю поля внутри него, которые необходимо проверить.

const schema = {
   id: 'Users_login_post',
   type: 'object',
   additionalProperties: false,
   properties: {
     headers: {
     type: 'object',
     additionalProperties: false,
     properties: {
      Authorization: {
        type: 'string',
        minLength: 10,
        description: 'Bearer token of the user.',
        errorMessages: {
          type: 'should be a string',
          minLength: 'should be atleast of 23 length',
          required: 'should have Authorization'
        }
      }
     },
     required: ['Authorization']
   },
   path: {
    type: 'object',
    additionalProperties: false,
    properties: {
      orgId: {
        type: 'string',
        minLength: 23,
        maxLength: 36,
        description: 'OrgId Id of the Organization.',
        errorMessages: {
          type: 'should be a string',
          minLength: 'should be atleast of 23 length', // ---> B
          maxLength: 'should not be more than 36 length',
          required: 'should have OrgId'
        }
      }
    },
    required: ['orgId']
   }
 }
};

Теперь в моем экспресс-коде я создал объект запроса, чтобы проверить правильность JSON в этом формате.

router.get("/org/:orgId/abc", function(req, res){
   var request = { //---> A
       path: {
          orgId : req.params.orgId
       },
       headers: {
          Authorization : req.headers.Authorization
       }
   }
   const Ajv = require('ajv');

   const ajv = new Ajv({
     allErrors: true,
   });

   let result = ajv.validate(schema, request);
   console.log(ajv.errorsText());
});

И я проверяю вышеупомянутый объект запроса (в A) по моей схеме, используя AjV.

Результат, который я получаю, выглядит примерно так:

data/headers should have required property 'Authorization', data/params/orgId should NOT be shorter than 23 characters

Теперь у меня есть список проблем:

  1. почему сообщение показывает слово data в data / headers и data / params / orgId, даже если имя моей переменной - request < / сильный> (в А)
  2. Также почему не используются мои сообщения об ошибках, как в случае с orgId, о котором я упоминал: должно быть не менее 23 длины (в точке B) в качестве сообщения , даже после этого пришло сообщение НЕ должно быть короче 23 символов.
  3. Как показать запрос / заголовки вместо данных / заголовков.

Кроме того, способ, которым я проверял свои параметры пути, параметры запроса, параметры заголовка, параметр тела, правильный ли это, если нет, то что может быть лучшим способом сделать то же самое?

Пожалуйста, пролей немного света.

Заранее спасибо.


person Ankur Verma    schedule 23.11.2017    source источник


Ответы (2)


Используйте ajv-ключевые слова

import Ajv from 'ajv';
import AjvKeywords from 'ajv-keywords';
// ajv-errors needed for errorMessage
import AjvErrors from 'ajv-errors';

const ajv = new Ajv.default({ allErrors: true });

AjvKeywords(ajv, "regexp");
AjvErrors(ajv);

// modification of regex by requiring Z https://www.regextester.com/97766
const ISO8601UTCRegex = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?Z$/;

const typeISO8601UTC = {
  "type": "string",
  "regexp": ISO8601UTCRegex.toString(),
  "errorMessage": "must be string of format 1970-01-01T00:00:00Z. Got ${0}",
};

const schema = {
  type: "object",
  properties: {
    foo: { type: "number", minimum: 0 },
    timestamp: typeISO8601UTC,
  },
  required: ["foo", "timestamp"],
  additionalProperties: false,
};

const validate = ajv.compile(schema);

const data = { foo: 1, timestamp: "2020-01-11T20:28:00" }

if (validate(data)) {
  console.log(JSON.stringify(data, null, 2));
} else {
  console.log(JSON.stringify(validate.errors, null, 2));
}

https://github.com/rofrol/ajv-regexp-errormessage-example

person rofrol    schedule 11.01.2021

AJV не может знать имя переменной, которую вы передали в функцию проверки.

Однако вы должны иметь возможность определить из массива errors, какие пути не удалось (и почему), и построить свои сообщения оттуда.

См. https://ajv.js.org/#validation-errors.

Чтобы использовать пользовательские сообщения об ошибках в вашей схеме, вам понадобится плагин AJV: ajv-errors.

См. https://github.com/epoberezkin/ajv-errors.

person customcommander    schedule 13.11.2018