Передать значение в определение схемы Json - PullRequest
0 голосов
/ 05 июня 2018

Я использую валидатор AJV-схемы на NodeJS и хочу добавить userID из sessionObject к каждой входящей полезной нагрузке, чтобы я мог хранить userID для каждой транзакции.

Я хочу знать, можно ли это сделать в схемах json.

sample Полезная нагрузка входящего клиента -

Client: {
Client_Id: 12,
ClientName: 'jon',
Address: [{
Address_Id: 22,
Street: 'Sesimi Street',
City: 'Mumbai'
}
],
Contact: [{
Contact_Id: 23,
Phone: 11111111,
Email: "jon@doe.com"}]

Проверка требуемой схемы объекта после проверки -

    Client: {
        Client_Id: 12,
        ClientName: 'jon',
        UserId: 12121,
        Address: [{
        Address_Id: 22,
        Street: 'Sesimi Street',
        City: 'Mumbai',
        UserId: 12121
        }
        ],
        Contact: [{
        Contact_Id: 23,
        Phone: 11111111,
        Email: "jon@doe.com",
        UserId: 12121
}]

Поскольку входящие полезные данные огромны, я считаю, что было бы лучше выполнять назначения в точке проверки схемы, а не выполнять рекурсивные операции внутри моего приложения.Я открыт для предложений.Спасибо

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Спасибо @vearutop за ваш ответ, который помог мне решить мою проблему.

Все, что я сделал, это использовал пользовательскую функцию, которая возвращает UserId из sessionObject

var Ajv = require("ajv");
var ajv = new Ajv({useDefaults: true,});
require("ajv-keywords")(ajv);
var definition = require('ajv-keywords/keywords/dynamicDefaults').definition;
definition.DEFAULTS.getuser = getuser;

  function getuser() {
        return sessionObject.UserId;
    }

var schema = {
  dynamicDefaults: {
    user: 'getuser'
},
 properties: {
  user: {}
 }
};
0 голосов
/ 06 июня 2018

Вы можете попробовать useDefaults функцию AJV.

var ajv = new Ajv({ useDefaults: true });
var schema = {
  "type": "object",
  "properties": {
    "ClientName": { "type": "string" },
    "UserId": { "type": "integer", "default": 12121 }
  }
};

var data = { "ClientName": "jon" };

var validate = ajv.compile(schema);

console.log(validate(data)); // true
console.log(data); // { "ClientName": "jon", "UserId": 12121 }

Чтобы иметь гибкость по умолчанию, вы можете использовать dynamicDefaults с функцией обратного вызова.Пример:

var uuid = require('uuid');

function getUuid(args) {
  var version = 'v' + (arvs && args.v || 4);
  return function() {
    return uuid[version]();
  };
}

var definition = require('ajv-keywords').get('dynamicDefaults').definition;
definition.DEFAULTS.uuid = getUuid;

var schema = {
  dynamicDefaults: {
    id1: 'uuid', // v4
    id2: { func: 'uuid', v: 4 }, // v4
    id3: { func: 'uuid', v: 1 } // v1
  }
};
...