【问题标题】:Pass value to Json schema Definition将值传递给 Json 模式定义
【发布时间】:2018-06-05 15:03:28
【问题描述】:

我在 NodeJS 上使用 AJV Schema 验证器,并希望将 userIDsessionObject 添加到每个传入的有效负载,以便我可以为每个事务存储 userID

我想知道这是否可以在 json 模式中完成。

示例传入客户端负载 -

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
}]

由于传入的有效负载很大,我相信最好在模式验证点进行分配,而不是在我的应用程序内部进行递归操作。我愿意接受建议。 谢谢

【问题讨论】:

    标签: javascript node.js jsonschema json-schema-validator ajv


    【解决方案1】:

    你可以试试AJV的useDefaults功能。

    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
      }
    };
    

    【讨论】:

    • UserId 对每个用户都是独一无二的。我不能使用任何硬编码值。我需要从 sessionObject 派生出来
    【解决方案2】:

    感谢@vearutop 的回答帮助我解决了我的问题。

    我所做的只是使用从sessionObject返回UserId的自定义函数

    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: {}
     }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2015-11-17
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多