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

使用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!');
}

关键修改说明

  1. 顶级结构补全:添加"type": "object"和"properties",告诉校验器这是一个对象,里面的字段都在properties下定义
  2. 字段类型明确:给每个属性(比如model、id、geometry等)都明确指定type,校验器才能识别类型规则
  3. 修正geometry.type定义:把错误的嵌套写法改成直接指定字段类型为string
  4. 坐标数组约束:给最内层的坐标数组添加minItems和maxItems,确保每个坐标都是3个数字组成的数组

现在再测试的话,输入非premium/basic的model值、非数字的坐标、缺少必填字段等情况,都会被正确拦截啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:54:08