【发布时间】:2021-09-03 17:12:49
【问题描述】:
我有一个express API 并运行joi 验证器作为我的中间件。我正在努力弄清楚如何对我的嵌套 JSON 对象执行条件检查。
当userSelection 是Yes 时,我基本上希望LocationData 是required。如果userSelection 是No 并且发送了LocationData,那么它应该给出一个错误。
另一个条件是,如果UserSelection 是Yes 并且发送了LocatoinData,我希望根据需要将所有数据包含在LocationData 中。你会注意到,如果name 存在,我将name、latitude 和longitude 设为必需。
下面是我的代码。问题是,即使将 userSelection 设置为 No,它仍然接受不应该发生的 LocationData。
这是我在体内发送的内容: “父母”:{ "userSelection":"是的", “位置数据”:{ "name":"位置名称", "address":"位置地址", "纬度":"-20.200202", “经度”:“50.230230” } }
以下是 JOI 验证架构:
let requiredIfExist = {
is: Joi.exist(),
then: Joi.required(),
otherwise: Joi.forbidden()
};
parent: Joi.object().required().keys({
userSelection: Joi.string().valid("Yes", "No").required(),
LocationData: Joi.object().keys({
name: Joi.string().min(3).max(100).when("userSelection", {
is: "Yes",
then: Joi.required(),
}).concat(Joi.string().when("userSelection", {
is: "No",
then: Joi.forbidden(),
})),
address: Joi.string().when("name", requiredIfExist),
latitude: Joi.number().min(-90).max(90).when("name",requiredIfExist),
longitude: Joi.number().min(-180).max(180).when("name", requiredIfExist)
}).concat(Joi.object().when("userSelection", {
is: "No",
then: Joi.forbidden(),
})),
})
【问题讨论】:
标签: node.js express validation joi