首页 > 解决方案 > Joi 基于更大的模式验证特定字段

问题描述

说我有以下架构

const schema = Joi.object({
  title: Joi.string().required(),
  start_date: Joi.date().iso().required(),
  end_date: Joi.date().iso().greater(Joi.ref('start_date')).required()
});

有一次我想针对一个对象验证整个架构

const obj = {
  title: 'abc',
  start_date: '2021-11-09',
  end_date: '2021-11-10'
}
const validationResult = schema.validate(obj);

另一方面,我想用我的部分对象来验证部分模式(例如,我不想担心缺少标题)

const obj = {
  start_date: '2021-11-09',
  end_date: '2021-11-11'
}
const validationResult = schema/*sudo*/.onlyFields(['start_date', 'end_date']).validate(obj);

可能吗?解决方法有 2 个模式 - titleSchema 和 dateSchema 并连接

标签: javascriptjoi

解决方案


使用schema.extractapi解决

function joiSubSchema(base, fields) {
  return fields.reduce((schema, field) => {
    return schema.concat(Joi.object({
      [field]: base.extract(field)
    }));
  }, Joi.object());
}

推荐阅读