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

使用Joi验证表单数据时遇‘对象不被允许’等错误求助

解决Joi表单验证错误的方案

问题根源

你的验证Schema和实际提交的数据结构不匹配,这是导致两个错误的核心原因:

  1. 第一个错误"title" is required:提交的数据是嵌套在campground对象里的,但你的Schema直接定义了title等顶级字段,Joi找不到顶级的title,加上stripUnknown:true后会直接移除顶级的campground字段,剩下空对象自然触发必填校验失败。
  2. 第二个错误"campground" is not allowed:移除stripUnknown:true后,Joi会严格校验所有顶级字段,但你的Schema里没有定义campground这个键,所以判定该字段非法。

修复步骤

1. 调整Schema匹配数据结构

把title、price等字段嵌套到campground键下,和提交的数据结构对齐:

const campJoiSchema = Joi.object({
  campground: Joi.object({
    title: Joi.string().min(3).max(50).required(),
    price: Joi.number().integer().required(),
    description: Joi.string().min(3).max(100).required(),
    location: Joi.string().required(),
    image: Joi.string()
  }).required()
}).options({ stripUnknown: true });

2. 处理数据类型不匹配问题

从错误日志里看到你提交的price是字符串"-1",但Schema要求整数类型。Joi默认不会自动转换字符串到数字,你可以开启自动转换:

// 给price字段添加自动转换选项
price: Joi.number().integer().required().convert(true)

3. 正确执行验证

验证时直接传入完整的提交对象(比如Express里的req.body):

const { error } = campJoiSchema.validate(req.body);
if (error) {
  // 处理验证错误
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:22:38