Javascript 在Joi验证中将'null'视为'undefined'

Javascript 在Joi验证中将'null'视为'undefined',javascript,validation,joi,Javascript,Validation,Joi,可选变量通过Joi进行验证和调节: optional = Joi.attempt(optional, Joi.array().optional().default([])); 用null替换undefined对于可选参数来说是常见且方便的,它应该将null视为undefined并返回默认值 如何实现这一目标?我在Joi方面也有类似的经验,答案是Joi关注的领域是验证。它不应该负责更改它接收的数据(尽管他们在中构建了这样的功能,例如string.replace,这会破坏这一原则) 如果您需要nu

可选变量通过Joi进行验证和调节:

optional = Joi.attempt(optional, Joi.array().optional().default([]));
null
替换
undefined
对于可选参数来说是常见且方便的,它应该将
null
视为
undefined
并返回默认值


如何实现这一目标?

我在Joi方面也有类似的经验,答案是Joi关注的领域是验证。它不应该负责更改它接收的数据(尽管他们在中构建了这样的功能,例如
string.replace
,这会破坏这一原则)


如果您需要
null
Array
项目,则需要构建Joi功能来验证您是否确实收到了
null
Array
项目,然后在收到的数据上实现您自己的逻辑,知道它将以您定义的形式出现。

我对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);
返回:

res1 [] null
res2 [] null // <-- victory
res3 [] null
res1[]空

res2[]null/也为此挣扎了一段时间,但今天终于找到了解决方案。您必须使用
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);
返回:

res1 [] null
res2 [] null // <-- victory
res3 [] null
res1[]空

res2[]null//因此,问题是如果传递
null
,它不会返回到
[]
,而是将
null
设置为值?@Yes。我真的希望使用Joi.Attement(可选===null?未定义:可选,…)
的丑陋方式比使用Joi.Attement(可选===null?未定义:可选,…)
的丑陋方式少。所以问题是,如果你通过
null
,它不会退回到
[]
,而是会将
null
设置为值?@Yes。我真的希望使用Joi的方式能比使用Joi.Attement(可选===null?未定义:可选,…)的方式少一些。哎哟,有人已经解决了所有问题:太好了,这解决了问题。谢谢你参考相关的问题哎哟,有人已经解决了:太好了,这就解决了问题。感谢您对相关问题的参考