如何扩展 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,则不允许使用任何键。如果schemanullundefined,任何 允许的密钥。如果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 模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何对一个扩展了抽象类的类进行单元测试,读取环境变量。

有没有办法合并 Joi 模式?

将 Joi 模式与 Mongoose 模式一起使用?

可扩展数据库模式 - 如何存储可扩展属性值

仅允许 Joi 模式中键的特定值

如何在隐身模式下启用我的 chrome 扩展程序?