在 Joi 验证中将“null”视为“undefined”
Treat `null` as `undefined` in Joi validation
可选变量已通过 Joi 验证和条件化:
optional = Joi.attempt(optional, Joi.array().optional().default([]));
将undefined
替换为null
对于可选参数来说是常见且方便的,它应该将null
视为undefined
并回退到默认值。
如何实现?
我和 Joi 有过类似的经历,答案是 Joi 关注的领域是验证。它不应该负责 更改 它接收到的数据(尽管他们已经构建了这样的功能,例如 string.replace
这确实打破了这个原则)。
如果您期待 null
或 Array
项,您将需要构建 Joi 功能来验证您确实收到了 null
或 Array
项,然后在知道它将采用您定义的形式的情况下对接收到的数据实施您自己的逻辑。
也纠结了一段时间,今天终于找到了解决办法。您必须使用 empty(null)
才能达到预期效果:
import * as joi from "joi";
const testSchema = joi.array().items(joi.string()).empty(null).allow(null).default([]);
const data1 = undefined;
const data2 = null;
const data3 = [];
const res1 = joi.validate(data1, testSchema);
const res2 = joi.validate(data2, testSchema);
const res3 = joi.validate(data3, testSchema);
console.log("res1", res1.value, res1.error);
console.log("res2", res2.value, res2.error);
console.log("res3", res3.value, res2.error);
Returns:
res1 [] null
res2 [] null // <-- victory
res3 [] null
可选变量已通过 Joi 验证和条件化:
optional = Joi.attempt(optional, Joi.array().optional().default([]));
将undefined
替换为null
对于可选参数来说是常见且方便的,它应该将null
视为undefined
并回退到默认值。
如何实现?
我和 Joi 有过类似的经历,答案是 Joi 关注的领域是验证。它不应该负责 更改 它接收到的数据(尽管他们已经构建了这样的功能,例如 string.replace
这确实打破了这个原则)。
如果您期待 null
或 Array
项,您将需要构建 Joi 功能来验证您确实收到了 null
或 Array
项,然后在知道它将采用您定义的形式的情况下对接收到的数据实施您自己的逻辑。
也纠结了一段时间,今天终于找到了解决办法。您必须使用 empty(null)
才能达到预期效果:
import * as joi from "joi";
const testSchema = joi.array().items(joi.string()).empty(null).allow(null).default([]);
const data1 = undefined;
const data2 = null;
const data3 = [];
const res1 = joi.validate(data1, testSchema);
const res2 = joi.validate(data2, testSchema);
const res3 = joi.validate(data3, testSchema);
console.log("res1", res1.value, res1.error);
console.log("res2", res2.value, res2.error);
console.log("res3", res3.value, res2.error);
Returns:
res1 [] null
res2 [] null // <-- victory
res3 [] null