使用 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
}
背景
我正在使用 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
}