使用 Joi 覆盖参数值

问题描述

我正在使用 Joi 来验证用于创建分页元数据的函数的参数。该函数接收以下参数 totalItemsNumskiplimit。我正在尝试实现以下场景:

1 - 当 totalItemsNum 等于 0 时,Joi 应将 skip 参数的值设置为零,而不考虑原始值。

2 - 当 totalItemsNum 不为零时,Joi 不应让 skip 参数等于或大于 totalItemsNum。因此,如果 skip 等于或大于 totalItemsNum,Joi 应将 skip 参数的值设置为 totalItemsNum - 1。

我设法使用以下代码实现了这一点:

  const validator = Joi.object({
    totalItemsNum: Joi
      .number()
      .min(0)
      .required(),skip: Joi
      .number()
      .when('totalItemsNum',[
        {
          is: 0,then: Joi
            .number()
            .optional()
            .empty(Joi.number())
            .default(0)
        },{
          is: Joi.number().equal(Joi.ref('skip')),then: Joi
            .number()
            .optional()
            .empty(Joi.number())
            .default((parent) => parent.totalItemsNum - 1)
        },{
          is: Joi.number().less(Joi.ref('skip')),]).required(),limit: Joi
      .number()
      .default(10)
  })

不过,我的印象是这段代码可以简化。例如,我总是将 skip 设置为可选,然后将任何数字值设置为使用 empty(Joi.number()) 识别为空值,最后使用 default() 强制该值我愿意。

  1. 有没有办法使用 Joi 重新分配值而不是使用 Joi.default()?

  2. 如果 skip 大于或等于 totalItemsNum,有没有办法检入同一个对象?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)