我正在使用 Joi
用于验证 body 数据。
所以,如果我有一个创建车辆的 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();
我可以在这里做的一件事是为相同的数据创建多个模式,这工作正常。
但最终创建了三到四个模式来验证相同的数据。
这附近有工作吗?我浏览了 doc,但我找不到任何类似的东西。
更新
为了验证所有字段,我找到了解决方法。
Joi.object({
registration_number: Joi.string(),
vehicle_id: Joi.string(),
.....
}).options({presence: 'required'})
最佳答案
要选择所需的 key ,请使用 and
方法
根据docs的 object.and(...peers, [options])
:
定义键之间的全有或全无关系,如果存在一个对等点,则所有这些都需要,其中:
peers
- 字符串键名称,如果存在,则全部为必填项。选项
optional settings
:separator
- 覆盖默认值。层次分隔符。设置为 false 以将键视为文字值。 const schema = Joi.object({ ... }).and("registration_number", "current_mileage");
关于javascript - 通过将选项传递给架构,使所有字段或某些字段成为必需字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61863671/