javascript - 如何比较joi中的两个字段?
问题描述
我尝试在两个字段之间进行验证。foo
和bar
。
- 两者都应该是一个字符串,但它们是可选的。如果它们有一些值,它应该是最小值 2 和最大值 10。
- 如果两者都为空(“”/null/undefined),则验证应该失败并返回错误。
我试着用
.when("bar", { is: (v) => !!v, then: Joi.string().required() }),
但不起作用error
return undefined
。
知道如何解决吗?
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 });
}
解决方案
这是用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' })
推荐阅读
- javascript - 一种编写 for 循环的更短的方法,避免制作太多类似的 if?
- javascript - this.state.annonces.map 不是函数
- java - 如何使用 Java Spring/React 下载 XLSX 文件?
- c# - 如何将对象添加到视图列表并将修改后的列表发布回控制器?(带有 mvc 的 ASP .NET 核心)
- c# - 映射时无法解析类型的服务
- web-scraping - 无论如何要抓取特定信息
- angular - Angular - 表单生成器 - 表单控件无效不更新/ngIf错误
- macos - 写入输出文件时出错 - 写入(28:设备上没有剩余空间)
- python - Python 中 (boolean list) 和 (another boolean list) 的奇怪行为
- python - |as_crispy_field 传递了一个无效或不存在的字段