使用Joi验证表单数据时遇‘对象不被允许’等错误求助
解决Joi表单验证错误的方案
问题根源
你的验证Schema和实际提交的数据结构不匹配,这是导致两个错误的核心原因:
- 第一个错误
"title" is required:提交的数据是嵌套在campground对象里的,但你的Schema直接定义了title等顶级字段,Joi找不到顶级的title,加上stripUnknown:true后会直接移除顶级的campground字段,剩下空对象自然触发必填校验失败。 - 第二个错误
"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
相关产品推荐
相关产品推荐

