如何清除Joi validator中validateAsync的警告上下文以重复使用Schema对象
如何清除Joi validator中validateAsync的警告上下文以重复使用Schema对象
嘿,这个问题我之前在项目里也踩过类似的坑!其实Joi的Schema对象本身是无状态且不可变的,理论上不会保留上一次校验的警告上下文,你遇到的情况大概率是代码处理上的小疏忽,或者对Joi的校验机制有点误解。我给你几个靠谱的解决办法:
每次调用
validateAsync时传入独立的配置选项
别偷懒复用同一个配置对象(哪怕看起来没修改),每次调用时直接在参数里定义配置,确保每次校验的上下文都是全新的:// 第一次校验 const firstResult = await schema.validateAsync({ username: 'a' }, { abortEarly: false, warnings: true }); // 第二次校验,完全独立的配置调用 const secondResult = await schema.validateAsync({ username: 'ba' }, { abortEarly: false, warnings: true });这样两次校验完全隔离,不会出现旧警告串到新校验里的情况。
不要复用旧的校验结果变量
Joi所有的警告、错误信息都存在每次validateAsync返回的结果(或抛出的错误)中,schema本身不会存储这些数据。如果你发现旧警告还在,大概率是代码里不小心重复使用了上一次的validationResult变量的警告内容。记得每次校验后都读取最新的结果:// 第一次校验,处理自己的结果 try { const result = await schema.validateAsync({ username: 'a' }, { abortEarly: false, warnings: true }); console.log("第一次警告:", result.warning); } catch (err) { console.error("第一次错误:", err.details); } // 第二次校验,读取全新的结果 try { const result = await schema.validateAsync({ username: 'ba' }, { abortEarly: false, warnings: true }); console.log("第二次警告:", result.warning); // 这里只会显示'ba'对应的警告 } catch (err) { console.error("第二次错误:", err.details); }确认是否误用了schema的修改方法
如果你之前对schema做了modify、fork这类操作,别误以为修改后的schema会影响原对象——Joi的schema是不可变的,所有修改方法都会返回新的schema实例,原schema还是干净的。所以哪怕你之前基于原schema创建过新的校验规则,原schema依然可以安全复用。
总结一下:Joi的Schema从设计上就是可以无限次复用的,根本不存在“残留上下文”的问题。你遇到的现象几乎都是代码处理层面的问题,只要确保每次校验都调用独立的validateAsync,并使用它返回的最新结果,就能解决旧警告残留的问题啦。
备注:内容来源于stack exchange,提问作者Loki
相关产品推荐
相关产品推荐

