簡體   English   中英

如何在Joi中將自定義驗證類型與其自身進行比較?

[英]How to compare the custom validation type with itself in Joi?

我需要使用Joi驗證對象,該對象具有兩個鍵startend ,它們是YYYY-MM-DD格式的日期字符串。

我需要此對象的驗證規則是:

  • 每個字段都是可選的
  • 如果提供,則每個字段應為有效日期(請參見isValidDate
  • end應該是start日期之后的日期(如果同時提供了endstart

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM