Express Validator - 如何处理条件验证
Express Validator - How to handle conditional Validation
我有一个表格,如果一个人的送货地址与他们的账单地址不同,他们将 select 一个单选按钮,上面写着 "no"。
我需要能够检查它的值是什么,如果它是 "no" 检查展开的表单。如果它是 "yes" 我跳到下面的下一个验证。 “是”部分有效,但 "no" 部分总是 returns 无效。有没有办法在这个库中像这样在条件中嵌套验证?
这是表格的屏幕截图:
这是我针对这种情况的验证码:
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',
}
我知道了,Express Validator 内置了条件检查
我使用 oneOf([]) 检查单选按钮的值是否为 "yes" 或 检查账单地址字段是否已填写。
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) => {...
现在似乎可以正常工作了。
有人对此有任何其他解决方案,或者发现我上面的解决方案有什么问题吗?
有一种更简单的方法可以将验证器变为有条件的。条件是一个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
添加到数组中。这会导致运行时错误,因此必须将其删除。这是有条件地添加验证器最简洁的方式。
您还可以使用 this conditional 来执行以下操作:
body('billingFirstName').if(body('billingSameAsShipping').equals('yes')).notEmpty(),
和排序
我有一个表格,如果一个人的送货地址与他们的账单地址不同,他们将 select 一个单选按钮,上面写着 "no"。
我需要能够检查它的值是什么,如果它是 "no" 检查展开的表单。如果它是 "yes" 我跳到下面的下一个验证。 “是”部分有效,但 "no" 部分总是 returns 无效。有没有办法在这个库中像这样在条件中嵌套验证?
这是表格的屏幕截图:
这是我针对这种情况的验证码:
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',
}
我知道了,Express Validator 内置了条件检查
我使用 oneOf([]) 检查单选按钮的值是否为 "yes" 或 检查账单地址字段是否已填写。
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) => {...
现在似乎可以正常工作了。
有人对此有任何其他解决方案,或者发现我上面的解决方案有什么问题吗?
有一种更简单的方法可以将验证器变为有条件的。条件是一个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
添加到数组中。这会导致运行时错误,因此必须将其删除。这是有条件地添加验证器最简洁的方式。
您还可以使用 this conditional 来执行以下操作:
body('billingFirstName').if(body('billingSameAsShipping').equals('yes')).notEmpty(),
和排序