快速验证器主体条件验证参数

问题描述

我有一条快速路线,我想将它用于三种不同的情况。逻辑是一样的,只是有一些小的修改,所以我不想创建单独的端点。我使用参数“type”来区分情况。

问题是我只想在参数 type 等于 'twoemails' 时使用第二个验证器,但我不知道该怎么做。我尝试使用 oneOf 和 anyOf 但它似乎没有用。谢谢!

myRoute.post('/myendpoint/:type',param('type','Invalid type').isIn(['oneemail','**twoemails**']),body('email1','first email invalid').isEmail(),body('email2','second email invalid').isEmail(),async (req,res) => {
      const errors = validationResult(req);

      if (!errors.isEmpty()) {
        return res.status(400).json({
          errors: errors.array(),});
      }
...

解决方法

您可以将 body('email2','second email invalid').isEmail() 替换为:

body('email2')
  .if(param('type').equals('twoemails'))
  .isEmail()
  .withMessage('second email invalid')

如果类型设置为 twoemails,它只会验证第二封电子邮件。这依赖于你的 param 行是这样的,没有 *s。

param('type','Invalid type').isIn(['oneemail','twoemails'])

所以整个解决方案

myRoute.post('/myendpoint/:type',param('type','twoemails']),body('email1','first email invalid').isEmail(),body('email2')
    .if(param('type').equals('twoemails'))
    .isEmail()
    .withMessage('second email invalid'),async (req,res) => {
      const errors = validationResult(req);

      if (!errors.isEmpty()) {
        return res.status(400).json({
          errors: errors.array(),});
      }
...