4

我正在尝试使用 express-validator 验证一组对象。

我一直在使用新的“通配符”和“自定义”来迭代对象数组,比较对象上的键。

这是问题所在,假设我的对象如下所示:

flavors:[
 { name: '', percentage: '0', ratio: '0' },
 { name: 'Strawberry', percentage: '2', ratio: '0' },
 { name: '', percentage: '3', ratio: '0' }
]

我如何只检查“名称”是否存在“如果”百分比> 0?

req.checkBody("flavors","Your recipe has no flavor!").notEmpty();
req.checkBody("flavors.*","Please enter a name for this flavor.").custom(function (value) {
    return (!(value.percentage > 0) && !value.name);
});

这可行,但“错误”输出将类似于:

{ 'flavors[2]': { 
     location: 'body',
     param: 'flavors[2]',
     msg: 'Please enter a name for this flavor.',
     value: { name: '', percentage: '3', ratio: '0' }
}}

这使得在我的 EJS 模板中显示时变得困难。

如何使用添加的密钥使输出看起来像这样?

{ 'flavors[2].name': { 
     location: 'body',
     param: 'flavors[2].name',
     msg: 'Please enter a name for this flavor.',
     value: { name: '', percentage: '3', ratio: '0' }
}}

希望有人可以在这里帮助我,谢谢!:-)

4

2 回答 2

2

目前,也可以这样做

req
.checkBody("flavors","Please enter a name for this flavor.")
.custom(data => 
   Array.isArray(data) 
      && 
   data.length 
      && 
   data.every(item => item.name && item.percentage > 0));

我希望它有帮助:)

于 2018-10-16T09:49:47.040 回答
1

目前这不是本机支持的,但在实施此问题时可能部分可用。

现在,在 lodash's 的帮助下_.toPath(),您可以实现它:

req.checkBody('flavors.*.name').custom((name, { req, location, path }) => {
  const index = _.toPath(path)[1];
  const { percentage } = req[location].flavors[index];

  // If percentage is 0, then it's always valid.
  return percentage > 0 ? name !== '' : true;
});
于 2018-07-02T10:33:45.813 回答