如何在Cerberus中验证嵌套对象?附问题场景及尝试操作
嵌套对象验证失败?我来帮你搞定!
兄弟,我太懂这种嵌套对象验证卡壳的糟心了——大概率是你的Schema结构写错了,我结合常见的JSON Schema场景给你分析下:
先还原你的场景(按你描述的情况模拟)
- 你定义的原始Schema(错误版):
{ "type": "object", "properties": { "userInfo": { "type": "object", "nickname": { "type": "string" }, "phone": { "type": "string", "pattern": "^1[3-9]\\d{9}$" } } }, "required": ["userInfo"] }
- 遇到的错误:不管
userInfo里的nickname填数字,还是phone格式不对,验证都不报错;甚至有时候直接提示userInfo不是合法对象。 - 你尝试的操作:给
userInfo加上了type: "object",但嵌套字段的验证还是完全没效果。
问题出在哪?
你犯了一个新手常踩的坑:嵌套对象的字段没有放在properties里!JSON Schema规定,对象类型的子属性必须包裹在properties字段下,直接写在对象层级的规则会被验证引擎忽略,等于白写。
修正后的正确Schema
把嵌套的nickname和phone放到properties里就行:
{ "type": "object", "properties": { "userInfo": { "type": "object", "properties": { "nickname": { "type": "string" }, "phone": { "type": "string", "pattern": "^1[3-9]\\d{9}$" } }, "required": ["nickname", "phone"] // 要是需要强制必填就加上 } }, "required": ["userInfo"] }
额外几个排查方向
- 如果你用的是Joi/Yup这类库:语法要对应调整,比如Joi的嵌套写法是这样的:
const schema = Joi.object({ userInfo: Joi.object({ nickname: Joi.string().required(), phone: Joi.string().pattern(/^1[3-9]\d{9}$/).required() }).required() });
- 开启严格验证模式:有些库默认宽松模式,会忽略未定义的字段,记得加上
additionalProperties: false(JSON Schema)或者strict()(Joi),防止奇葩数据绕过验证。 - 看完整错误信息:别只看表层提示,打印验证库返回的完整错误对象,里面会精准指出哪个字段不符合规则,帮你快速定位。
内容的提问来源于stack exchange,提问作者user9377278
相关产品推荐
相关产品推荐

