【发布时间】:2018-07-12 16:55:13
【问题描述】:
我需要使用具有两个键 start 和 end 的 Joi 验证对象,它们是 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()
如果“结束”键和“开始”键类型相同,如何比较它们?
【问题讨论】:
标签: javascript validation datetime