【问题标题】:Make all fields or some of required by passing options to schema通过将选项传递给架构,使所有字段或某些字段成为必需字段
【发布时间】:2020-09-03 21:38:50
【问题描述】:

我正在使用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'})

【问题讨论】:

  • 既然你找到了解决方案,我想你也应该发布一个答案
  • 那不回答问题,我还需要回答其他部分。
  • 结账@saurabh answer here 挺全面的。

标签: javascript joi


【解决方案1】:

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

根据object.and(...peers, [options])docs

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

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

【讨论】:

  • 不,它不能按我想要的方式工作。它将它们结合在一起,没有其他就无法存在。但我希望对单个字段进行控制,而不需要相互依赖。 .with() 也是如此
  • 但它也会产生依赖性。如果我使用.with(),我就不能拥有registration_number,而没有current_mileage
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 2018-09-12
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多