Joi模式验证,表示字段之间的关系

时间:2017-05-25 11:33:53

标签: validation joi

有没有办法用Joi表达数据中的关系?

e.g。

  const schema = ({
    min: number(),
    max: number(),
  });

我可以添加一个说明data.min < data.max的验证规则吗?

编辑:添加示例

Ankh的例子是真正帮助我的,因为文档有点精益。 Joi tests for ref帮助了ref的其他功能。

下面还包括我根据Ankh的答案进行的实验

describe.only("joi features", () => {
  const minMax = {
    min: Joi.number().less(Joi.ref("max")),
    max: Joi.number(),
    deep: {
      min: Joi.number().less(Joi.ref("max")),
      max: Joi.number().required()
    },
    minOfAll: Joi.number().less(Joi.ref("max")).less(Joi.ref("deep.max"))
  };
  it("handles max and min relationships", () => {
    expect(Joi.validate({ min: 0, max: 99 }, minMax).error).to.not.exist;
    expect(Joi.validate({ deep: { min: 0, max: 99 } }, minMax).error).to.not.exist;

    expect(Joi.validate({ min: 99, max: 0 }, minMax).error).to.exist;
    expect(Joi.validate({ deep: { min: 99, max: 0 } }, minMax).error).to.exist;

    expect(Joi.validate({ deep: { max: 99 }, max: 99, minOfAll: 88 }, minMax).error).to.not.exist;
    expect(Joi.validate({ deep: { max: 25 }, max: 99, minOfAll: 88 }, minMax).error).to.exist;
    expect(Joi.validate({ deep: { max: 99 }, max: 25, minOfAll: 88 }, minMax).error).to.exist;
  });
});

1 个答案:

答案 0 :(得分:4)

肯定有办法,你会想看看Joi.ref()。您可以使用它来引用同一Joi架构中的参数。

const schema = Joi.object({
    min: Joi.number().less(Joi.ref('max')).required(),
    max: Joi.number().required()
});

此架构可确保minmax字段为整数,并且min必须小于max的值时才需要。