使用jsonschema-master验证Express POST请求JSON值失效问题排查
问题分析与修复方案
看起来你遇到的问题是JSON Schema的结构不符合规范,导致jsonschema-master无法正确识别枚举、类型校验等规则。咱们一步步来修正:
核心问题点
你的Schema缺少JSON Schema规范要求的基础结构,同时部分字段的定义格式错误:
- 顶级Schema没有声明
"type": "object"和"properties"字段,这是描述对象类型数据的必备结构 geometry.type的定义写错了,应该直接指定类型为string,而非嵌套的{"type": "string"}coordinates的嵌套数组校验规则有误,没有正确约束每个坐标子数组的长度和类型
修正后的Schema与代码
下面是调整后的完整代码,我会标注关键修改点:
var Validator = require('jsonschema-master').Validator; var v = new Validator(); // 修正后的Schema var bodySchema = { "type": "object", // 新增:声明这是一个对象类型的Schema "properties": { // 新增:包裹所有属性定义 "model": { "type": "string", // 新增:明确字段类型为字符串 "enum": ["premium", "basic"] // 枚举规则现在会生效 }, "areas": { "type": "array", "items": { "type": "object", // 新增:声明每个数组元素是对象 "properties": { // 新增:包裹areas数组元素的属性 "id": {"type": "string"}, "geometry": { "type": "object", // 新增:声明geometry是对象 "properties": { // 新增:包裹geometry的属性 "type": {"type": "string"}, // 修正:直接指定类型为string,去掉多余嵌套 "coordinates": { "type": "array", "items": { "type": "array", "items": { "type": "array", "items": {"type": "number"}, "minItems": 3, // 新增:确保每个坐标有3个数字 "maxItems": 3 } } } }, "required": ["type", "coordinates"] } }, "required": ["id", "geometry"] } } }, "required": ["model", "areas"] }; var valResult = v.validate(doc.request, bodySchema); if (valResult.errors.length) { console.log('Request invalid: '+ doc._id +" - "+valResult.errors.join(', ')); } else { console.log('Request is valid!'); }
关键修改说明
- 顶级结构补全:添加
"type": "object"和"properties",告诉校验器这是一个对象,里面的字段都在properties下定义 - 字段类型明确:给每个属性(比如
model、id、geometry等)都明确指定type,校验器才能识别类型规则 - 修正
geometry.type定义:把错误的嵌套写法改成直接指定字段类型为string - 坐标数组约束:给最内层的坐标数组添加
minItems和maxItems,确保每个坐标都是3个数字组成的数组
现在再测试的话,输入非premium/basic的model值、非数字的坐标、缺少必填字段等情况,都会被正确拦截啦。
内容的提问来源于stack exchange,提问作者Caroline Keay
相关产品推荐
相关产品推荐

