【问题标题】:Express Validator - How to handle conditional ValidationExpress Validator - 如何处理条件验证
【发布时间】:2019-03-07 02:13:00
【问题描述】:

我有一个表格,如果一个人的送货地址与他们的账单地址不同,他们会选择一个单选按钮说“否”。

我需要能够检查 this 的值是什么,如果它是“否”,请检查展开的表单。如果是“是”,我会跳到下面的下一个验证。 “是”部分正在工作,但“否”部分总是返回无效。有没有办法使用这个库在这样的条件中嵌套验证?

这是表格的截图:

这是我在这种情况下的验证代码:

    router.post('/testData2/', [
      body('billingSameAsShipping', "Please Fill All Fields Of Your Billing Address").custom((value) => {
        if (value === 'no') {
          [
            body('billingFirstName', "Please Enter Your First Name").isLength({
              min: 1
            }),
            body('billingLastName', "Please Enter Your Last Name").isLength({
              min: 1
            }),
            body('billingAddress1', "Please Enter Your Billing Address").isLength({
              min: 1
            }),
            body('billingZip', "Please Enter Your Billing ZipCode").isLength({
              min: 1
            }),
            body('billingCity', "Please Enter Your Billing City").isLength({
              min: 1
            }),
            body('billingState', "Please Enter Your Billing State").isLength({
              min: 1
            })
          ]
        } else {

          return Promise.resolve();
        }

      }),
    body('creditCardNumber', 'Please Enter A Vaild Credit Card Number').isCreditCard(),
    body('expmonth', 'Exp Month Empty').isLength({
      min: 1
    }),
    body('expyear', 'Exp Year Empty').isLength({
      min: 1
    }),
    body('CVV', 'CVV Empty').isLength({
      min: 3
    })
  ],
  (req, res) => {...

这是我们正在检查的请求对象

{
  billingSameAsShipping: 'no',
  billingFirstName: 'First',
  billingLastName: 'Last',
  billingAddress1: '450 Test Ave',
  billingZip: '12345',
  billingCity: 'San Diego',
  billingState: 'CA',
}

【问题讨论】:

    标签: node.js express express-validator validator.js


    【解决方案1】:

    我明白了,Express Validator 内置了条件检查

    我使用 oneOf([]) 检查单选按钮的值是否为“是”检查帐单地址字段是否已填写。

    router.post('/testData2/', [
        oneOf([
          [
            body('billingFirstName', "Please Enter Your First Name").isLength({
              min: 1
            }),
            body('billingLastName', "Please Enter Your Last Name").isLength({
              min: 1
            }),
            body('billingAddress1', "Please Enter Your Billing Address").isLength({
              min: 1
            }),
            body('billingZip', "Please Enter Your Billing ZipCode").isLength({
              min: 1
            }),
            body('billingCity', "Please Enter Your Billing City").isLength({
              min: 1
            }),
            body('billingState', "Please Enter Your Billing State").isLength({
              min: 1
            })
          ],
          body('billingSameAsShipping').equals('yes')
        ], "Please Fill Out All Fields Of Your Billing Address"),
        body('creditCardNumber', 'Please Enter A Vaild Credit Card Number').isCreditCard(),
        body('expmonth', 'Exp Month Empty').isLength({
          min: 1
        }),
        body('expyear', 'Exp Year Empty').isLength({
          min: 1
        }),
        body('CVV', 'CVV Empty').isLength({
          min: 3
        })
      ],
      (req, res) => {...
    

    现在似乎工作正常。

    任何人对此有任何其他解决方案,或者看到我上面的解决方案有什么问题?

    【讨论】:

    • 我正在使用自定义验证器,这有助于我更轻松地解析客户端的错误body("billingFirstName") .custom((value, { req }) => { return req.body.billingSameAsShipping === 'yes' ? true : value }) .isLength({ min: 1 }) .withMessage("Please Enter Your First Name")
    【解决方案2】:

    有一种更简单的方法可以使验证器有条件。条件是boolean,因此您可以简单地使用&& 逻辑运算符来决定是否将验证器添加到数组中。

    router.post('/testData2/', [
    
       req.body.billingSameAsShipping && body('billingFirstName')
          .isLength({ min: 1 }),
    
       req.body.billingSameAsShipping && body('billingLastName')
          .isLength({ min: 1 })
    
       ].filter(x => !!x)
    )
    

    最后的过滤器是必需的,因为如果条件评估为false,它会将false 添加到数组中。这将导致运行时错误,因此必须将其删除。这是有条件地添加验证器的最简洁的方法。

    【讨论】:

      【解决方案3】:

      您还可以使用this conditional,它允许执行以下操作:

      body('billingFirstName').if(body('billingSameAsShipping').equals('yes')).notEmpty(),
      

      排序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 2023-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多