ajv-validator / ajv-validator/ajv-errors

Default error message does not produce consistent output for `oneOf` nested in an array (expect 1 errors in output)

未关闭
#83 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
TypeScript
星标
289
派生
21
PR 合并指标
30 天内没有已合并 PR

描述

`ajv@7.0.3`
`ajv-errors@2.0.0`

Greets,

I have included schema and simple test case below showing that a default error message does not produce consistent results. For some reason the "nested" oneOf statement w/ default error message produces two entries in the `errors` output. The oneOf statement at the top level which is exactly the same produces one entry in the `errors` output.

IE for the schema below the entry count with the default error message should be the same for both failing validation cases:

`{ system: [false] }` and `{ packs: [{ system: [false] }] }`

The latter is not picking up the child items type error in the default error message which is part of the oneOf block.

``` javascript
const Ajv = require("ajv").default;
const ajv = new Ajv({ allErrors: true });

// Ajv option allErrors is required
require("ajv-errors")(ajv);

const schema = {
$id: "test",
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
packs: {
type: "array",
items: {
type: "object",
properties: {
system: {
oneOf: [
{ type: "string" },
{
items: { type: "string" },
type: "array"
}
],
errorMessage: "should be a string or array of strings"
}
}
}
},
system: {
oneOf: [
{ type: "string" },
{
items: { type: "string" },
type: "array"
}
],
errorMessage: "should be a string or array of strings"
}
}
};

const validate = ajv.compile(schema);

// Expect `errorMessage` to catch all errors at or below the oneOf level.
console.log(`{ system: [false] }:`);
console.log(JSON.stringify(validate.errors, null, 3));

// Expect `errorMessage` to catch all errors at or below the oneOf level.
// However it does not catch the further items type and there are two errors.
console.log('\n-------------------------------------------------------------\n');
console.log(`expect only one error in 'errors', but there are two for { packs: [{ system: [false] }] }:`);
console.log(JSON.stringify(validate.errors, null, 3));
```

#Output:

``` json
{ system: [false] }:
[
{
"keyword": "errorMessage",
"dataPath": "/system",
"schemaPath": "#/properties/system/errorMessage",
"params": {
"errors": [
{
"keyword": "type",
"dataPath": "/system",
"schemaPath": "#/properties/system/oneOf/0/type",
"params": {
"type": "string"
},
"message": "should be string",
"emUsed": true
},
{
"keyword": "type",
"dataPath": "/system/0",
"schemaPath": "#/properties/system/oneOf/1/items/type",
"params": {
"type": "string"
},
"message": "should be string",
"emUsed": true
},
{
"keyword": "oneOf",
"dataPath": "/system",
"schemaPath": "#/properties/system/oneOf",
"params": {
"passingSchemas": null
},
"message": "should match exactly one schema in oneOf",
"emUsed": true
}
]
},
"message": "should be a string or array of strings"
}
]

-------------------------------------------------------------

expect only one error in 'errors', but there are two for { packs: [{ system: [false] }] }:
[
{
"keyword": "type",
"dataPath": "/packs/0/system/0",
"schemaPath": "#/properties/packs/items/properties/system/oneOf/1/items/type",
"params": {
"type": "string"
},
"message": "should be string"
},
{
"keyword": "errorMessage",
"dataPath": "/packs/0/system",
"schemaPath": "#/properties/packs/items/properties/system/errorMessage",
"params": {
"errors": [
{
"keyword": "type",
"dataPath": "/packs/0/system",
"schemaPath": "#/properties/packs/items/properties/system/oneOf/0/type",
"params": {
"type": "string"
},
"message": "should be string",
"emUsed": true
},
{
"keyword": "oneOf",
"dataPath": "/packs/0/system",
"schemaPath": "#/properties/packs/items/properties/system/oneOf",
"params": {
"passingSchemas": null
},
"message": "should match exactly one schema in oneOf",
"emUsed": true
}
]
},
"message": "should be a string or array of strings"
}
]
```

贡献指南

这个仓库没有索引到贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。