首页 > 解决方案 > 如何比较joi中的两个字段?

问题描述

我尝试在两个字段之间进行验证。foobar

  1. 两者都应该是一个字符串,但它们是可选的。如果它们有一些值,它应该是最小值 2 和最大值 10。
  2. 如果两者都为空(“”/null/undefined),则验证应该失败并返回错误。

我试着用

.when("bar", { is: (v) => !!v, then: Joi.string().required() }),

但不起作用errorreturn undefined

知道如何解决吗?

码沙盒.io

const Joi = require("joi");

console.clear();

const schema = Joi.object({
  foo: Joi.string()
    .allow("", null)
    .optional()
    .min(2)
    .max(10)
    .when("bar", {
      is: (v) => !!v,
      then: Joi.string().required()
    }),
  bar: Joi.string().allow("", null).optional().min(2).max(10)
});

const { error } = schema.validate(
  { foo: null, bar: null },
  { allowUnknown: true, abortEarly: false }
);

const { error: error2 } = schema.validate(
  { foo: null, bar: "text" },
  { allowUnknown: true, abortEarly: false }
);

console.log({ error }); // should be with error.
console.log({ error2 }); // should be undefiend.

if (error) {
  const { details } = error;
  console.log({ details });
}

if (error2) {
  const { details } = error2;
  console.log({ details });
}

标签: javascriptjoi

解决方案


这是用Joi完成的:

const schema = Joi.object({
    password: Joi.string()
        .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
    
    repeat_password: Joi.ref('password')
})
.with('password', 'repeat_password')

const { error } = schema.validate({ password: 'BlaBlaaa', repeat_password: 'Bla' })

推荐阅读