【问题标题】:How to compare the custom validation type with itself in Joi?如何在 Joi 中将自定义验证类型与自身进行比较?
【发布时间】:2018-07-12 16:55:13
【问题描述】:

我需要使用具有两个键 startend 的 Joi 验证对象,它们是 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()

如果“结束”键和“开始”键类型相同,如何比较它们?

【问题讨论】:

    标签: javascript validation datetime


    【解决方案1】:

    回答我自己的问题:

    我发现 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2016-02-10
      • 2019-12-05
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      相关资源
      最近更新 更多