【问题标题】:Validating Request Schema With Fastify and AJV使用 Fastify 和 AJV 验证请求模式
【发布时间】:2018-04-15 03:11:16
【问题描述】:

背景

我正在使用 Fastify 构建一个 API,这是我第一次使用 JSON 模式验证。这个想法是,它既可以提高服务器代码的效率,又可以帮助我们的开发人员学习如何使用我的 API。

问题

我正在尝试验证允许客户端仅按名称查询小猫的路线。一个成功的形成查询应该是/kittens?name=fluffykins

我的这条路线的架构如下所示:

{
  querystring: {
    type: 'object',
    name: { type: 'string' },
  }
}

问题

如何让我的架构验证器只接受 name 上的查询并拒绝像 /kittens?age=1 这样的其他查询?我的偏好是架构验证器独立于我的控制器代码来处理它,并且它还支持我们将来可能添加的查询。

谢谢!

【问题讨论】:

    标签: json validation jsonschema ajv


    【解决方案1】:

    就像我向 SO 发布问题时的典型做法一样,我很快就会自己找到答案。以下是对我有用的方法,但我仍然很想知道是否还有其他更好的方法!

    {
      querystring: {
        type: 'object',
        properties: {
            name: { type: 'string' }
        },
        anyOf: [
          {
            required: [ 'name' ]
          }
        ],
      },
    }
    

    【讨论】:

      【解决方案2】:

      我不太确定你想用 anyOf 做什么,所以我可能会遗漏一些东西,但我相信这就是你想要的(如果你使用的是 draft-06 或更高版本):

      {
          "type": "object",
          "required": ["name"],
          "propertyNames": {"enum": ["name"]},
          "properties": {
              "name": {"type": "string"}
          }
      }
      

      propertyNames 确保 name 是唯一可接受的属性。您也可以通过设置"additoinalProperties": false 来执行此操作(如果您使用的是draft-04,您必须这样做,因为它不支持propertyNames)。但是这样做可能会在您尝试组合模式时导致意外问题,因此如果您可以使用 draft-06 propertyNames 会更灵活。

      这是draft-04版本:

      {
          "type": "object",
          "required": ["name"],
          "properties": {
              "name": {"type": "string"}
          },
          "additionalProperties": false
      }
      

      【讨论】:

        猜你喜欢
        • 2018-06-05
        • 1970-01-01
        • 2021-04-19
        • 1970-01-01
        • 2017-04-29
        • 2018-10-21
        • 2020-01-20
        • 2018-02-03
        • 1970-01-01
        相关资源
        最近更新 更多