Json 使用Fastify和AJV验证请求架构 背景
我正在用Fastify构建一个API,这是我第一次使用JSON模式验证。这样做的目的是,它既可以提高服务器代码的效率,也可以帮助开发人员了解如何使用我的API 问题 我正在尝试验证一个路由,该路由允许客户端仅按名称查询小猫。一个成功形成的查询看起来像Json 使用Fastify和AJV验证请求架构 背景,json,validation,jsonschema,ajv,Json,Validation,Jsonschema,Ajv,我正在用Fastify构建一个API,这是我第一次使用JSON模式验证。这样做的目的是,它既可以提高服务器代码的效率,也可以帮助开发人员了解如何使用我的API 问题 我正在尝试验证一个路由,该路由允许客户端仅按名称查询小猫。一个成功形成的查询看起来像/kittens?name=fluffykins 我的此路由架构如下所示: { querystring: { type: 'object', name: { type: 'string' }, } } 问题: 如何使我的模式
/kittens?name=fluffykins
我的此路由架构如下所示:
{
querystring: {
type: 'object',
name: { type: 'string' },
}
}
问题:
如何使我的模式验证器只接受name
上的查询,并拒绝其他查询,如/kittens?age=1
?我的首选是模式验证器独立于控制器代码来处理它,并支持我们将来可能添加的查询
谢谢 当我向SO发帖时,我会很快找到答案。以下是对我有效的方法,但我仍然有兴趣听到是否有其他更好的方法来做到这一点
{
querystring: {
type: 'object',
properties: {
name: { type: 'string' }
},
anyOf: [
{
required: [ 'name' ]
}
],
},
}
我不太清楚您想用
anyOf
做什么,所以我可能遗漏了一些东西,但我相信这正是您想要的(如果您使用的是draft-06或更高版本):
propertyNames
确保name
是唯一可接受的属性。您也可以通过设置“AdditionInalProperties”:false来实现这一点(如果您使用的是draft-04,则必须这样做,因为它不支持propertyNames
)。但是当您尝试组合模式时,这样做可能会导致意外问题,因此如果您可以使用draft-06propertyNames
,则更加灵活
以下是草稿-04版本:
{
"type": "object",
"required": ["name"],
"properties": {
"name": {"type": "string"}
},
"additionalProperties": false
}
{
"type": "object",
"required": ["name"],
"properties": {
"name": {"type": "string"}
},
"additionalProperties": false
}