使用Fastify和AJV验证请求架构

时间:2017-11-02 14:37:14

标签: json validation jsonschema ajv

背景

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

问题

我尝试验证允许客户端仅按名称查询小猫的路由。成功构建的查询将显示为/kittens?name=fluffykins

此路线的架构如下所示:

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

问题

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

谢谢!

2 个答案:

答案 0 :(得分:3)

就像我向SO发帖时的典型情况一样,我很快就会找到答案。以下是对我有用的,但我仍然有兴趣听听是否还有其他更好的方法来做到这一点!

[\d+]

答案 1 :(得分:1)

我不太确定你要对{ "type": "object", "required": ["name"], "propertyNames": {"enum": ["name"]}, "properties": { "name": {"type": "string"} } } 做什么,所以我可能会遗漏一些东西,但我相信这就是你想要的(如果你使用的是草案06或更高版本):

propertyNames

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

这是draft-04版本:

<%= stylesheet_link_tag 'application', media: 'all' %>