使用Joi.object.keys()时nodemon报Joi.object.keys is not a function错误如何解决
报错原因
- 核心是Joi版本API不兼容:你过往项目使用的是v16及更早的Joi版本,当前项目安装的是v17+版本,新版本已经移除了
Joi.object.keys静态方法,仅保留实例方法;还有部分情况是写法遗漏括号,keys是Joi.object()返回的schema实例上的方法,不能直接通过Joi.object静态对象调用。
解决方案
提供两种可选处理方式:
方式1:修改代码适配新版本(推荐)
无需调整依赖版本,直接修改原有写法即可,两种兼容写法任选:
- 直接把字段规则传入
Joi.object()方法(最简洁,全版本兼容):
const checkSchema = Joi.object({ email: Joi.string().email({ minDomainSegments: 2 }), password: Joi.string().pattern(new RegExp('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$ %^&*-]).{8,}$')), confirmPassword: Joi.string().valid(Joi.ref('password')).required(), });
- 补全
object后的括号,调用实例上的keys方法:
const checkSchema = Joi.object().keys({ email: Joi.string().email({ minDomainSegments: 2 }), password: Joi.string().pattern(new RegExp('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$ %^&*-]).{8,}$')), confirmPassword: Joi.string().valid(Joi.ref('password')).required(), });
方式2:降级Joi到兼容版本
如果不想修改业务代码,可以将Joi版本回退到和旧项目一致的v16版本:
- 先卸载当前版本:
npm uninstall joi - 安装指定旧版本:
npm install joi@16.1.8
注意:如果当前项目安装的是已停止维护的
@hapi/joi包,建议直接替换为官方维护的joi包,再按方式1修改代码即可。
内容的提问来源于stack exchange,提问作者ozygz
相关产品推荐
相关产品推荐

