AJV - 检查 属性 是一个函数
AJV - Check property is a function
我正在使用 AJV 检查 "settings" 对象。我想添加一个新的 属性 onFeedbackChange
可以是一个函数(不是必需的)。
const ajv = new Ajv({
allErrors: true,
});
ajv.addKeyword('function', {
valid: true,
validate: function (data) {
return typeof data === 'function';
}
});
const validate = ajv.compile(settingsSchema);
架构:
feedback:
type: object
properties:
enabled:
type: boolean
saveFeedback: *endpoint
updateFeedback: *endpoint
onFeedbackChange: function
additionalProperties: false
required:
- enabled
- saveFeedback
- updateFeedback
但这失败了:
Error: schema is invalid: data.properties['modules'].properties['feedback'].properties['onFeedbackChange'] should be object,boolean
我想知道如何执行验证,以及为什么这不是内置的。
我们正在使用它来验证包含 React 组件的数据:
我们正在验证的数据:
const config = {
id: 'dailyGraph',
component: BarGraph, // <-- react component (function)
type: 'bar',
...
}
我们的架构:
const barSchema = {
$schema: 'http://json-schema.org/draft-07/schema',
$id: 'dailyGraph',
type: 'object',
readOnly: true,
title: 'Schema for validating graph config',
properties: {
id: {
$id: '#/properties/id',
type: 'string'
},
component: {
$id: '#/properties/component',
instanceof: 'Function', // <-- ajv custom keyword
},
type: {
$id: '#/properties/type',
type: 'string',
enum: ['bar','pie'],
}
...
},
required: ['id', 'assays', 'graphType']
};
以及此处的 .addKeyword
语法:https://github.com/epoberezkin/ajv/issues/147#issuecomment-199371370
const ajv = new Ajv();
const { id } = config;
const CLASSES = { Function: Function, ... };
ajv.addKeyword('instanceof', {
compile: schema => data => data instanceof CLASSES[schema]
});
ajv.validate(barSchema, config)
? res(true)
: console.error(`Graph config error for ${id}: ${ajv.errorsText()}`);
将 component
作为字符串(或函数以外的任何内容)传递会抛出:Graph config error for dailyGraph: data.component should pass "instanceof" keyword validation
我正在使用 AJV 检查 "settings" 对象。我想添加一个新的 属性 onFeedbackChange
可以是一个函数(不是必需的)。
const ajv = new Ajv({
allErrors: true,
});
ajv.addKeyword('function', {
valid: true,
validate: function (data) {
return typeof data === 'function';
}
});
const validate = ajv.compile(settingsSchema);
架构:
feedback:
type: object
properties:
enabled:
type: boolean
saveFeedback: *endpoint
updateFeedback: *endpoint
onFeedbackChange: function
additionalProperties: false
required:
- enabled
- saveFeedback
- updateFeedback
但这失败了:
Error: schema is invalid: data.properties['modules'].properties['feedback'].properties['onFeedbackChange'] should be object,boolean
我想知道如何执行验证,以及为什么这不是内置的。
我们正在使用它来验证包含 React 组件的数据:
我们正在验证的数据:
const config = {
id: 'dailyGraph',
component: BarGraph, // <-- react component (function)
type: 'bar',
...
}
我们的架构:
const barSchema = {
$schema: 'http://json-schema.org/draft-07/schema',
$id: 'dailyGraph',
type: 'object',
readOnly: true,
title: 'Schema for validating graph config',
properties: {
id: {
$id: '#/properties/id',
type: 'string'
},
component: {
$id: '#/properties/component',
instanceof: 'Function', // <-- ajv custom keyword
},
type: {
$id: '#/properties/type',
type: 'string',
enum: ['bar','pie'],
}
...
},
required: ['id', 'assays', 'graphType']
};
以及此处的 .addKeyword
语法:https://github.com/epoberezkin/ajv/issues/147#issuecomment-199371370
const ajv = new Ajv();
const { id } = config;
const CLASSES = { Function: Function, ... };
ajv.addKeyword('instanceof', {
compile: schema => data => data instanceof CLASSES[schema]
});
ajv.validate(barSchema, config)
? res(true)
: console.error(`Graph config error for ${id}: ${ajv.errorsText()}`);
将 component
作为字符串(或函数以外的任何内容)传递会抛出:Graph config error for dailyGraph: data.component should pass "instanceof" keyword validation