首页 > 解决方案 > 通过将选项传递给模式,使所有字段或某些字段成为必需字段

问题描述

Joi用于验证身体数据。

所以,如果我有一个创建车辆的 API。我会创建一个如下所示的架构。

const validateUserVehicleData = (data) => {
  const schema = Joi.object({
    id: Joi.string(),
    odometer_count: Joi.number().allow(null),
    registration_number: Joi.string(),
    current_milage: Joi.number(),
    last_service_date: Joi.date(),
    last_service_km: Joi.number(),
    chassis_num: Joi.string(),
    engine_num: Joi.string(),
    vehicle_id: Joi.string(),
  });
  return schema.validate(data);
};

我知道我可以在这里单独vehicle_id: Joi.string().required()要求它们。

但我想通过将动态数据传递给模式对象来制作一些字段。

就像,如果我只想制作其中的几个,如下所示。

//It should make registration_number and currrent_mileage required
const schema = Joi.object({..}).required(['registration_number', 'currrent_mileage ']); // I know this doesn't exist but if there is any workaround

我还尝试了类似下面的方法来使所有这些都成为必需的,但它既不工作也不抛出任何错误。

// It should make all fields required
const schema = Joi.object({..}).required(); 

我可以在这里做的一件事为相同的数据创建多个模式,这工作正常。

但最终创建了三到四个模式来验证相同的数据。

这里有什么工作吗?我浏览了文档,但找不到任何类似的东西。

更新

为了验证所有字段,我找到了解决方法。

Joi.object({
    registration_number: Joi.string(),
    vehicle_id: Joi.string(),
    .....
}).options({presence: 'required'})

标签: javascriptjoi

解决方案


要选择所需的键,请使用and方法

根据以下文档object.and(...peers, [options])

定义键之间的全有或全无关系,如果其中一个对等点存在,则它们都是必需的,其中:

  • peers- 字符串键名,如果存在,则全部都是必需的。选项
  • optional settings
    • separator- 覆盖默认值。层次分隔符。设置为 false 以将键视为文字值。
const schema = Joi.object({ ... }).and("registration_number", "current_mileage");

推荐阅读