我正在使用Yup验证注册表单,但由于需要Yup的string
和number
架构中的方法,我很难验证信用卡字段。
卡号例如不应超过16个字符。使用max
模式中的string
方法可以轻松实现这一点。但是,如果用户键入16个字母而不是数字,则此时将通过验证。如果我将架构从string
更改为number
,则max
的行为方式不同,而是将字段中的所有数字相加,并检查它是否等于更少比最大数量。
我需要使用min
架构的max
和number
方法的字段示例是到期月份,其中min为1,最大值为12.但是,我仍然需要检查以确保此字段中的字符数为2,因为1月到9月应该使用前导0。
const validationSchema = {
cardNumber: Yup.string()
.label('Card number')
.max(16)
.required(),
cvc: Yup.string()
.label('CVC')
.min(3)
.max(4)
.required(),
nameOnCard: Yup.string()
.label('Name on card')
.required(),
expiryMonth: Yup.string()
.label('Expiry month')
.min(2)
.max(2)
.required(),
expiryYear: Yup.string()
.label('Expiry year')
.min(4)
.max(4)
.required(),
};
答案 0 :(得分:5)
您可以使用Yup的测试方法并返回第三方验证程序提供的true
或false
,而不用像这样进行验证。例如:braintree/card-validator
。
因此,看起来像这样:
import valid from 'card-validator'; //import statement
CreditCardNumber:
Yup
.string()
.test('test-number', // this is used internally by yup
'Credit Card number is invalid', //validation message
value => valid.number(value).isValid) // return true false based on validation
.required()
还有valid.expirationDate(value).isValid
,valid.cvv(value).isValid
和valid.postalCode(value).isValid
希望有帮助!
答案 1 :(得分:1)
这是我使用Yup's .test()
方法来验证信用卡过去的有效期的方法。
1)我必须使用掩码,通过使用掩码,我必须使用的DOM元素是一个输入字段。掩码看起来像这样__/__
(两个下划线之间用正斜杠分隔)
首先,验证开始于:
export const expirationDate = Yup.string()
.typeError('Not a valid expiration date. Example: MM/YY')
.max(5, 'Not a valid expiration date. Example: MM/YY')
.matches(
/([0-9]{2})\/([0-9]{2})/,
'Not a valid expiration date. Example: MM/YY'
)
.required('Expiration date is required')
即使已经进行了服务器端验证,我仍然应该努力防止诸如13/19
或99/99
之类的错误输入。为什么要浪费往返网络呼叫。因此,在.matches()
和.required()
方法调用之间,我添加了:
.test(
'test-credit-card-expiration-date',
'Invalid Expiration Date has past',
expirationDate => {
if (!expirationDate) {
return false
}
const today = new Date()
const monthToday = today.getMonth() + 1
const yearToday = today
.getFullYear()
.toString()
.substr(-2)
const [expMonth, expYear] = expirationDate.split('/')
if (Number(expYear) < Number(yearToday)) {
return false
} else if (
Number(expMonth) < monthToday &&
Number(cexpYear) <= Number(yearToday)
) {
return false
}
return true
}
)
.test(
'test-credit-card-expiration-date',
'Invalid Expiration Month',
expirationDate => {
if (!expirationDate) {
return false
}
const today = new Date()
.getFullYear()
.toString()
.substr(-2)
const [expMonth] = expirationDate.split('/')
if (Number(expMonth) > 12) {
return false
}
return true
}
)
参考: