[英]How to compare the custom validation type with itself in Joi?
我需要使用Joi验证对象,该对象具有两个键start
和end
,它们是YYYY-MM-DD
格式的日期字符串。
我需要此对象的验证规则是:
isValidDate
) end
应该是start
日期之后的日期(如果同时提供了end
和start
) Joi没有为没有时间的日期比较提供自定义验证,因此我需要扩展它,这是我的解决方案:
const date = Joi.extend({
base: Joi.string(),
name: 'string',
language: {
isValidDate: 'is not a valid date'
},
rules: [{
name: 'isValidDate',
validate(params, value, state, options) {
if (!moment(value, 'YYYY-MM-DD', true).isValid()) {
return this.createError('date.isValidDate', { v: value }, state, options);
}
return value;
}
}, {
name: 'isDateAfter',
params: {
another: Joi.string().required() // This is where I'm stuck
},
validate(params, value, state, options) {
if (!moment(value, 'YYYY-MM-DD', true).isAfter(params.another, 'day')) {
return this.createError('date.isValidDate', { v: value }, state, options);
}
return value;
}
}]
});
我的架构是这样描述的:
Joi.object({
start: datetime.string().isValidDate(),
end: datetime.string().isValidDate()
.isDateAfter(Joi.ref('start', { default: '0000-00-00' }))
}).optional()
如果运行此命令,将会出现错误:
ValidationError: {
"another" [1]: "[ref:start]"
}
[1] "another" must be a string
103 | start: datetime.string().isValidDate(),
104 | end: datetime.string().isValidDate()
> 105 | .isDateAfter(Joi.ref('start', { default: '0000-00-00' }))
106 | }).optional()
如果它们是相同类型,如何比较“结束”键和“开始”键?
回答我自己的问题:
我发现Joi本身的维护者提供了一个比较日期的扩展名,称为joi-date-extensions
。 因此,我可以轻松地比较日期而无需自定义验证,例如:
date: Joi.object({
start: Joi.date().format('YYYY-MM-DD'),
end: Joi.date().format('YYYY-MM-DD').min(Joi.ref('start', { default: '0000-00-00' }))
}).optional()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.