2

背景

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

问题

我正在尝试验证一条允许客户端仅按名称查询小猫的路线。一个成功的已形成查询将看起来/kittens?name=fluffykins

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

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

问题

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

谢谢!

4

2 回答 2

6

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

{
  querystring: {
    type: 'object',
    properties: {
        name: { type: 'string' }
    },
    anyOf: [
      {
        required: [ 'name' ]
      }
    ],
  },
}
于 2017-11-02T14:44:10.383 回答
3

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

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

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

这是draft-04版本:

{
    "type": "object",
    "required": ["name"],
    "properties": {
        "name": {"type": "string"}
    },
    "additionalProperties": false
}
于 2017-11-24T22:24:54.870 回答