首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AJV和ajv-格式最新的必须打破在反应。

AJV和ajv-格式最新的必须打破在反应。
EN

Stack Overflow用户
提问于 2021-12-22 21:34:40
回答 1查看 2K关注 0票数 2

几个月以来,我一直在使用AJV进行验证。在v6.x上运行了一段时间,现在需要升级以获得格式设置和自定义错误消息才能工作。不幸的是,它似乎被严重破坏了。我在错误报告和其他闲聊中找不到任何帮助。

套餐:

代码语言:javascript
复制
"ajv": "^8.8.2",
"ajv-errors": "^3.0.0",
"ajv-formats": "^2.1.1",

为了明确起见,我可以让它在Express API中正常工作,声明如下:

代码语言:javascript
复制
const Ajv = require("ajv");
const ajv = new Ajv({ allErrors: true, strict: false });
const ajvFormats = require("ajv-formats")(ajv);
const ajvErrors = require("ajv-errors")(ajv);

然而,我也在反应项目中使用它,而这正是它运行的地方。声明如下:

代码语言:javascript
复制
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构造函数中使用的选项如何,它都会产生以下错误:

代码语言:javascript
复制
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)将得到一个单独的、完全不同的错误:

代码语言:javascript
复制
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;

我是索尔吗?这些项目死了吗?我在那里看到的bug报告中很少有活动。我已经投入了大量的时间,并围绕这个库编写了大量代码,作为我的验证库,因为它每月被下载数千万次。看起来很安全!不是超级鼓舞人心。:(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-22 22:03:55

一个答案,如果没有其他人有任何东西,是找到包装版本甜点。当然,最好不要浪费时间来拼凑这些东西:

代码语言:javascript
复制
npm install ajv@7.2.3 ajv-errors@2.0.1 ajv-formats@2.1.1 --save

有趣的是,它的反应很好,就像这样:

代码语言:javascript
复制
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中,这些完全相同的包版本现在正在爆炸:

代码语言:javascript
复制
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);

...with这个error..which看起来很荒谬。

Ajv不是构造函数。

我真的很茫然。我已经准备好回到Joi了,因为我在几年的使用中从未遇到过问题。

更新:

这解决了上面构造函数错误的问题:TypeError: Ajv is not a constructor

与之相关的似乎是移动目标。我把这个版本设成定局,从来不升级!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70455362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档