You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用express+joi@17.4.2+joi-objectid出现AssertionError报错如何解决

问题原因

你遇到的两个错误分别由版本不兼容、类型声明缺失导致:

  1. 运行时AssertionError:joi-objectid@2.0.0最高仅支持Joi v16版本,你使用的Joi v17重构了内部导出结构,传入的Joi实例无法被旧版joi-objectid识别。
  2. TS类型报错:Joi官方类型定义中没有objectId属性,手动挂载方法后需要扩展类型声明才能被TS识别。

运行时错误解决方案

方案1(推荐,保留Joi v17)

使用兼容Joi v17的ObjectId校验包替代旧版joi-objectid:

  1. 执行命令替换依赖:
    npm uninstall joi-objectid && npm install joi-oid
  2. 修改导入代码:
const Joi = require("joi")
Joi.objectId = require("joi-oid")
  1. 修正校验规则的大小写(你原来写的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方法的类型声明:

  1. 在项目根目录新建类型声明文件joi.d.ts,添加如下内容:
import 'joi';

declare module 'joi' {
  interface Root {
    objectId: () => Schema;
  }
}
  1. 确保tsconfig.json的include配置包含该声明文件即可。如果临时调试也可以在导入代码上方添加// @ts-ignore忽略单行类型检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:18:02