问题描述
我使用 express-validator(6.x) 版本来验证输入请求参数。
我有一个地址嵌套对象,所以这个字段是可选的,但如果有地址键,其他嵌套对象是必需的。
样本输入
const details = {
name: "abcd",address: {
area: "test1",city: {
code: "123",name: "test"
},state: {
code: "123",country: {
code: "123",name: "test"
}
}
}
const validate = [
body('name').not().isEmpty().isstring(),body('address.area').optional().isstring(),body('address.city.name').optional().isstring(),body('address.city.code').optional().isstring(),body('address.state.name').optional().isstring(),body('address.state.code').optional().isstring(),body('address.country.code').optional().isstring(),body('address.country.name').optional().isstring(),]
router.route('/:userId')
.put(update,function(req,res){
//code....
})
样本输入#1(有效)
const details = {
name: "abcd"
}
样本输入#2:
const details = {
name: "abcd",address: {}
}
以上输入无效,应该包含所有地址嵌套对象,如区域、州、国家...
最好的方法是什么?
解决方法
我会使用自定义验证器来检查地址值存在时的条件,如下所示
const validate = [
body('name').not().isEmpty().isString(),body('address').optional(),body('address.city.name').custom((value,{req}) => {
if(req.body.address != undefined && req.body.address.city.name == undefined){
throw new Error("City is required for the address");
}
else {
return true;
}
})
];