NodeJs express-validator - 验证嵌套对象

问题描述

我使用 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;
    }
  })
];