如何扩展 Joi 模式?
Posted
技术标签:
【中文标题】如何扩展 Joi 模式?【英文标题】:How to extend a Joi schema? 【发布时间】:2019-12-06 11:50:07 【问题描述】:我有一个名为 user 的 joi 模式
const user =
firstName: Joi.string()
.min(2)
.max(50)
.required()
.label('First Name'),
lastName: Joi.string()
.min(3)
.max(50)
.required()
.label('Last Name'),
email: Joi.string()
.allow('')
.email( minDomainAtoms: 2 )
.max(100)
.label('Email Address'),
我还有一个叫 owner
const ownerSchema =
firstName: Joi.string()
.min(2)
.max(50)
.required()
.label('First Name'),
lastName: Joi.string()
.min(3)
.max(50)
.required()
.label('Last Name'),
email: Joi.string()
.allow('')
.email( minDomainAtoms: 2 )
.max(100)
.label('Email Address'),
number: Joi.string()
.regex(/[0-9]/)
.length(10)
.required()
.label('Phone Number'),
dateOfBirth: Joi.date(),
kycDetails: Joi.array()
.items(schemaKyc)
.required(),
bankDetails: Joi.array()
.items(schemaBank)
.required(),
licenceDetails: Joi.array()
.items(schemaLicence)
.required(),
insuranceDetails: Joi.array()
.items(schemaInsurance)
.required()
;
如您所见,两者有三个共同的字段,我希望能够在所有者中使用用户架构,并且每当我对用户进行更改时,我希望它也反映在所有者中。
【问题讨论】:
【参考方案1】:您可以使用object.keys([schema])
,其中
设置或扩展允许的对象键,其中:
schema
- 可选对象,其中每个键都分配有一个 joi 类型的对象。 如果schema
是,则不允许使用任何键。如果
schema
是null
或undefined
,任何 允许的密钥。如果schema
是带有键的对象,则将键添加到 任何先前定义的键(但如果所有键都缩小选择范围 以前允许)。默认为“未定义”,允许任何孩子 键。
例子:
const base = Joi.object().keys(
a: Joi.number(),
b: Joi.string()
);
// Validate keys a, b and c.
const extended = base.keys(
c: Joi.boolean()
);
【讨论】:
【参考方案2】:你可以在spreaduser
里面ownerSchema
:
const ownerSchema =
...user,
/* owner specific fields goes here */
;
【讨论】:
以上是关于如何扩展 Joi 模式?的主要内容,如果未能解决你的问题,请参考以下文章