繁体   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