我使用的是Node 9.2.0和ajv 6.0.0。
我有一个架构,我希望使用负面的lookbehind,它被定义为:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "release format",
"description": "A Release Format",
"type": "object",
"properties": {
"id": {"type": "integer"},
"title": {
"anyOf": [
{
"type": "string",
"pattern": "^((?!itunes).)*$"
},
{
"type": "string",
"pattern": "^((?!exclusive).)*$"
},
{
"type": "string",
"pattern": "^((?!ringtone).)*$"
}
]
}
}
}
但是,当我尝试使用以下数据使用AJV验证时:{"id": 123, "title": "world exclusive"}
我没有收到验证错误。
代码:
const Ajv = require('ajv');
class Validator {
constructor() {
this.releaseFormatSchema = JSON.parse(fs.readFileSync('./schemas/release-format.json'));
this.schemaValidator = new Ajv({allErrors: true});
}
validate(data) {
let validate = this.schemaValidator.compile(this.releaseFormatSchema);
let valid = validate(data);
console.log(valid);
console.log(validate);
}
}
其中数据为:{"id": 123, "title": "world exclusive"}
。我希望这会出错,但它目前告诉我数据是有效的。
答案 0 :(得分:0)
@sln和@ClasG也找到了答案,anyOf标题模式之间的联合可以匹配:“除了包含itunes的字符串之外的所有字符”union“除了包含独占”union“......的字符串外,其中表示不包含所有禁用关键字的所有内容。它可以修复
使用allOf
代替anyOF
"title": {
"allOf": [
{
"type": "string",
"pattern": "^((?!itunes).)*$"
},
{
"type": "string",
"pattern": "^((?!exclusive).)*$"
},
{
"type": "string",
"pattern": "^((?!ringtone).)*$"
}
]
}
使用单一类型/模式:
"title": {
"type": "string",
"pattern": "^((?!itunes|exclusive|ringtone).)*$"
}