使用express+joi@17.4.2+joi-objectid出现AssertionError报错如何解决
问题原因
你遇到的两个错误分别由版本不兼容、类型声明缺失导致:
- 运行时
AssertionError:joi-objectid@2.0.0最高仅支持Joi v16版本,你使用的Joi v17重构了内部导出结构,传入的Joi实例无法被旧版joi-objectid识别。 - TS类型报错:Joi官方类型定义中没有
objectId属性,手动挂载方法后需要扩展类型声明才能被TS识别。
运行时错误解决方案
方案1(推荐,保留Joi v17)
使用兼容Joi v17的ObjectId校验包替代旧版joi-objectid:
- 执行命令替换依赖:
npm uninstall joi-objectid && npm install joi-oid - 修改导入代码:
const Joi = require("joi") Joi.objectId = require("joi-oid")
- 修正校验规则的大小写(你原来写的
Joi.ObjectId()首字母大写和挂载的属性名不匹配):
enroledcourses: Joi.array().items(Joi.objectId()).required()
方案2(兼容旧代码)
将Joi版本降级到v16适配现有joi-objectid:
执行命令降级Joi:npm uninstall joi && npm install joi@16.x
原有导入和校验规则无需额外修改。
TS类型报错解决方案
给Joi扩展objectId方法的类型声明:
- 在项目根目录新建类型声明文件
joi.d.ts,添加如下内容:
import 'joi'; declare module 'joi' { interface Root { objectId: () => Schema; } }
- 确保
tsconfig.json的include配置包含该声明文件即可。如果临时调试也可以在导入代码上方添加// @ts-ignore忽略单行类型检查。
内容的提问来源于stack exchange,提问作者callme gravity
相关产品推荐
相关产品推荐

