将值传递给 Json 架构定义
Pass value to Json schema Definition
我在 NodeJS 上使用 AJV 架构验证器,并希望将 userID
从 sessionObject
添加到每个传入的有效负载,以便我可以为每个事务存储 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"}]
所需对象 post 架构验证 -
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
}]
由于传入的有效载荷很大,我认为最好在模式验证点进行分配,而不是在我的应用程序内部进行递归操作。我愿意接受建议。
谢谢
您可以尝试 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
}
};
谢谢@vearutop 的回答帮助我解决了问题。
我所做的只是使用 returns 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: {}
}
};
我在 NodeJS 上使用 AJV 架构验证器,并希望将 userID
从 sessionObject
添加到每个传入的有效负载,以便我可以为每个事务存储 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"}]
所需对象 post 架构验证 -
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
}]
由于传入的有效载荷很大,我认为最好在模式验证点进行分配,而不是在我的应用程序内部进行递归操作。我愿意接受建议。 谢谢
您可以尝试 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
}
};
谢谢@vearutop 的回答帮助我解决了问题。
我所做的只是使用 returns 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: {}
}
};