AJV和最新的AJV格式必须在React中打破



几个月来,我一直在使用AJV进行验证。在v6.x上运行了一段时间,现在需要升级以使格式和自定义错误消息正常工作。不幸的是,它似乎坏得很厉害。我在bug报告和其他聊天中找不到任何帮助。

包装:

"ajv": "^8.8.2",
"ajv-errors": "^3.0.0",
"ajv-formats": "^2.1.1",

需要明确的是,我可以让它在ExpressAPI中正常工作,声明如下:

const Ajv = require("ajv");
const ajv = new Ajv({ allErrors: true, strict: false });
const ajvFormats = require("ajv-formats")(ajv);
const ajvErrors = require("ajv-errors")(ajv);

然而,我也在React项目中使用它,这就是它的魅力所在。声明如下:

import Ajv from "ajv";
import AjvFormats from "ajv-formats";
import AjvErrors from "ajv-errors";
const ajv = new Ajv({ 
allErrors: true, 
strict: false, 
strictTypes: false,
code: { optimize: false } 
});
AjvErrors(ajv);
AjvFormats(ajv);

无论Ajv构造函数中使用什么选项,都会产生以下错误:

TypeError: Cannot read properties of undefined (reading 'allErrors')
ajvErrors
src/index.ts:385
Module.<anonymous>
src/mod/validator.js:10
7 |     strictTypes: false,
8 |     code: { optimize: false } 
9 | });
> 10 | AjvErrors(ajv);
11 | AjvFormats(ajv);

如果我注释掉AjvErrors(ajv(行,看看格式是否有效,我会得到一个单独的、完全不同的AjvFormats(ajv(错误:

TypeError: Cannot read properties of undefined (reading 'code')
addFormats
src/index.ts:55
52 |     if (items) {
53 |         errors.items = {};
54 |         for (let i = 0; i < items.length; i++)
> 55 |             errors.items[i] = [];
| ^  56 |     }
57 |     return errors;
58 | }
View compiled
formatsPlugin
src/index.ts:42
39 |     const schMessage = typeof sch == "string" ? sch : sch._;
40 |     if (schMessage)
41 |         processAllErrors(schMessage);
> 42 |     if (!options.keepErrors)
| ^  43 |         removeUsedErrors();
44 | });
45 | function childErrorsConfig({ properties, items }) {
View compiled
Module.<anonymous>
src/mod/validator.js:11
8 |     code: { optimize: false } 
9 | });
10 | // AjvErrors(ajv);
> 11 | AjvFormats(ajv);
12 | 
13 | const initValidationCache = async () => {
14 |     let { entityType, schema } = window;

我是SOL吗?这些项目死了吗?我看到的错误报告中几乎没有什么活动。我已经投入了大量的时间,并围绕这个库写了很多代码,作为我的验证库,因为它每月下载数千万次。看起来很安全!不太令人鼓舞(

如果没有其他人拥有任何东西,那么一个答案就是找到包版本的最佳点。当然,如果不浪费几个小时试图把这些拼凑在一起,那就太好了:

npm install ajv@7.2.3 ajv-errors@2.0.1 ajv-formats@2.1.1 --save

有趣的是;它在React中工作得很好:

import Ajv from "ajv";
import AjvFormats from "ajv-formats";
import AjvErrors from "ajv-errors";
const ajv = new Ajv({ 
allErrors: true, 
strict: false
});
AjvFormats(ajv);
AjvErrors(ajv);

但这些完全相同的包版本在我的Express API现在炸弹:

const Ajv = require("ajv");
const ajv = new Ajv({ allErrors: true, strict: false }); //this fails!
const AjvFormats = require("ajv-formats");
const AjvErrors = require("ajv-errors");
AjvFormats(ajv);
AjvErrors(ajv);

出现此错误。。这似乎很荒谬。

Ajv不是构造函数

我真的不知所措。我准备回到Joi,因为我在使用几年后从未遇到过问题。

更新:

这解决了上面构造函数错误的问题:TypeError:Ajv不是构造函数

AJV和相关车辆似乎是移动目标。我正在设置这个版本的石头和永远不会升级!

最新更新