node.js - OpenAPI:可选属性的强制属性
问题描述
和标题说的差不多。我在请求正文中有一个可选对象。但是,如果给定了该对象,则它应该强制包含一些子属性。
我的 OpenAPI 组件配置如下所示:
UserDetails:
type: object
properties:
surname:
type: string
givenName:
type: string
dob:
type: string
format: date
gender:
type: string
enum:
- male
- female
- others
partner:
type: object
properties:
name:
type: string
phone:
type: string
maxLength: 10
minLength: 10
pattern: ^[1-9]+[0-9]{9}$
required: [name, phone]
required:
- surname
- givenName
- dob
我express-openapi-validator
用来验证这一点。现在,我不明白这是否是express-openapi-validator
包的问题,但可选字段(合作伙伴)的必填字段(姓名、电话)从未经过验证。我可以提供partner: {}
,它直接通过,甚至,partner: { name: 'some name', phone: '123' }
。应验证电话号码的长度和正则表达式。
我在定义中遗漏了什么吗?
解决方案
似乎没有解决方案,但我关闭它只是为了让我安心。
就像@Helen 回答的那样,这似乎是图书馆本身的问题。在开发我的应用程序的过程中,我发现了更多的问题,这使得我使用的库express-openapi-validator
和另一个库swagger-express-middleware
对于验证请求的可靠性更差。
我发现的另一个问题是,只有当它作为数组提供时,才使用提供的枚举验证值:
例如。以下内容已正确验证:
UserLiabilities:
type: object
properties:
liabilities:
type: object
properties:
creditCards:
type: array
items:
allOf:
- $ref: '#/components/schemas/Provider'
- type: object
properties:
limit:
type: number
minimum: 0
这里提供者是:
Provider:
type: object
properties:
provider:
type: string
enum: ['ABC', 'DEF', 'GHI', 'Others']
但是,如果我需要提供者作为对象中的纯字符串(而不是像上面这样的数组),则不会对其进行验证。而且,它允许任意字符串:
homeLoan:
allOf:
- $ref: '#/components/schemas/Provider'
- type: object
properties:
amount:
type: number
minimum: 0
这种行为与我在上面尝试和提到的至少两个库是一致的。我不确定我在这里做错了什么,但是我已经失去了足够的时间来尝试调试它,并且不得不最终在我的服务器本身中解决这个问题。
推荐阅读
- go - 在反向代理中多次重复 http.Request
- vue.js - 使用 vueitify 动态构建 html 颜色增强列表
- reactjs - 导出字典为空
- reactjs - 页面内容在初始加载时不断变化。难道是一切都没有正确呈现?
- javascript - 如何在 url 中添加 wordpress 帖子标题?
- php - mysql中未保留来自textarea的换行符
- python - 尝试使用 python 脚本通过 SSH 连接进行远程登录
- c# - 如何在 Visual Studio 中使用 VSTO 项目配置 log4net
- java - Hibernate 搜索中 LocalDate 的 DateBridge
- java - 没有控制反转的 JUnit