使用 Fastify 和 AJV 验证请求模式

Validating Request Schema With Fastify and AJV

背景

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

问题

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

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

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

问题

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

谢谢!

当我 post 向 SO 提问时,我很快就会自己找到答案。以下是对我有用的方法,但我仍然很想知道是否还有其他更好的方法!

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

我不太确定你想用 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
}