javascript - Fastify 模式验证不起作用。我是否以错误的方式配置了某些东西?
问题描述
我试图弄清楚为什么模式验证在 Fastify 中不起作用。我有以下代码:
const postOptions = {
schema: {
body: {
type: 'object',
properties: {
name: { type: 'string' },
parentId: { type: 'number' },
requiredKey: { foo: { type: 'string'} }
}
},
response: {
201: {
type: 'object',
properties: {
id: { type: 'number'},
name: { type: 'string'},
parentId: { type: 'number' }
}
}
}
}
}
fastify.post('/sponsor', postOptions, async (request, reply) => {
console.log(`POST /sponsor called`)
return { id: 2, name: 'Zenotis', parentId: 1 }
})
当我使用邮递员对其进行测试时,我可以将任何键和值与正文一起发送,并且一切正常。好像根本不检查。与响应相同。我正在使用 Fastify 版本 2.11.0
编辑:这是我发送的 json 正文:
{
"name": "Test",
"parentId": 5555555,
"foo": "bar"
}
这是我期望失败的:
{
"myName": "the field is not name",
"parentID": "The D is capitalized and this is a string",
"bar": "where did this field come from, it's not foo"
}
如果我发送这个身体,它会顺利通过。在所有这些情况下,如何将其配置为失败?
解决方案
您的架构使用需要应用一些修复:
- 如果您不设置状态码 201,您设置的响应模式将不起作用。在对象中使用
'2xx'
或设置正确的代码reply
- 删除不在您需要添加的架构中的字段
additionalProperties
- 如果您没有
required
在架构中设置字段,则所有字段都是可选的
这是一个阻塞示例:
const fastify = require('fastify')()
const postOptions = {
schema: {
body: {
type: 'object',
additionalProperties: false, // it will remove all the field that is NOT in the JSON schema
required: [
'name',
'parentId',
'requiredKey'
],
properties: {
name: { type: 'string' },
parentId: { type: 'number' },
requiredKey: { foo: { type: 'string' } }
}
},
response: {
201: {
type: 'object',
properties: {
id: { type: 'number' },
name: { type: 'string' },
parentId: { type: 'number' }
}
}
}
}
}
fastify.post('/sponsor', postOptions, async (request, reply) => {
console.log('POST /sponsor called')
reply.code(201) // if you don't set the code 201, the response schema you set will not work
return request.body
})
fastify.inject({
method: 'POST',
url: '/sponsor',
payload: {
name: 'Test',
parentId: 5555555,
foo: 'bar'
}
}, (_, res) => {
console.log(res.json())
/* it will print
{
statusCode: 400,
error: 'Bad Request',
message: "body should have required property 'requiredKey'"
}
*/
})
推荐阅读
- python - 导入 PyQt5 时如何修复“ModuleNotFound”错误?
- python - Selenium Webdriver 在尝试访问文本时返回 None
- reactjs - 如果我在 setState 方法中传递上一个状态值,为什么我的组件会再次呈现?
- javascript - 页面导航栏——不占空间
- c# - 异步/等待试图停止 Windows 服务
- python - 如果目录为空,则不创建新文件
- python - 如何将令牌传递给需要在 django rest 框架中进行身份验证的视图
- c# - 如何启用 json.net 的严格转换?
- javascript - JavaScript 如何在 Chrome 等现代浏览器中处理垃圾?
- python - 在 Python Pomegranate 中,如何创建具有伯努利分布的贝叶斯模型?