[英]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.