You need to enable JavaScript to run this app. 使用Joi.object.keys()时nodemon报Joi.object.keys is not a function错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

使用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:修改代码适配新版本(推荐)

无需调整依赖版本,直接修改原有写法即可,两种兼容写法任选:

  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(),
});
  1. 补全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版本:

  1. 先卸载当前版本:
    npm uninstall joi
  2. 安装指定旧版本:
    npm install joi@16.1.8

注意:如果当前项目安装的是已停止维护的@hapi/joi包,建议直接替换为官方维护的joi包,再按方式1修改代码即可。

内容的提问来源于stack exchange,提问作者ozygz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 03:36:01