Javascript Joi-默认情况下是否生成所需的所有内容?
我正在构建一个Node/Express API,并使用Joi进行验证。这是一个很棒的软件包,非常有用。然而,我们已经厌倦了这样的事情:Javascript Joi-默认情况下是否生成所需的所有内容?,javascript,node.js,validation,joi,Javascript,Node.js,Validation,Joi,我正在构建一个Node/Express API,并使用Joi进行验证。这是一个很棒的软件包,非常有用。然而,我们已经厌倦了这样的事情: const mySchema = joi.object({ thing1: joi.string().required(), thing2: joi.string().required(), thing3: joi.string().required(), thing4: joi.string().required(),
const mySchema = joi.object({
thing1: joi.string().required(),
thing2: joi.string().required(),
thing3: joi.string().required(),
thing4: joi.string().required(),
thing5: joi.string().required(),
}).required();
我们希望在默认情况下所有内容都是必需的,并手动调用.optional
来覆盖它。事实上,这似乎是一个合理的违约——但暂时搁置
有没有办法做到这一点?没有一种标准的方法来制作所需的每一把钥匙,但有一些变通方法。
解决方法之一是在
Joi.object()上使用.requiredKeys()
和.optionalKeys()
看看函数,
它返回一个对象,该对象具有键标志
当一个键被标记为“可选”时,我们会得到flags.presence='optional'
使用这些信息,您可以对每个键调用.descripe()
,并准备两个requiredKey
和可选键数组
然后,您可以将这些数组分别传递给.requiredKeys()
和.optionalKeys()
例如:
假设您将joi模式定义为:
const joiSchemaKeys = {
thing1: Joi.string(),
thing2: Joi.string().optional(),
thing3: Joi.string(),
thing4: Joi.string(),
thing5: Joi.string().required()
};
然后,您可以使用以下方法准备两个数组optionalKeys
和requiredKeys
:
const initialKeyInformation = {
requiredKeys: [],
optionalKeys: []
};
const prepareKeysInformation = keys =>
Object.keys(keys).reduce((accumulated, aKey) => {
const description = keys[aKey].describe();
const isMarkedOptional =
description.flags &&
description.flags.presence &&
description.flags.presence === "optional";
if (isMarkedOptional) {
console.log(`"${aKey}" is marked optional`);
accumulated.optionalKeys.push(aKey);
} else {
console.log(`"${aKey}" is not marked, making it required`);
accumulated.requiredKeys.push(aKey);
}
return accumulated;
}, initialKeyInformation);
const { optionalKeys, requiredKeys } = prepareKeysInformation(joiSchemaKeys);
完成后,您可以准备joi模式,如下所示:
const schema = Joi.object()
.keys(joiSchemaKeys)
.requiredKeys(requiredKeys)
.optionalKeys(optionalKeys);
这样,除非另有规定,否则您将使每个键都成为必需的。您可以使用进位
选项使字段默认为必需字段。例如:
const mySchema = joi.object({
thing1: joi.string(),
thing2: joi.string(),
thing3: joi.string(),
thing4: joi.string(),
thing5: joi.string(),
}).options({presence: 'required'});
为什么不围绕这一点构建一个包装函数?@madalinivascu,因为它似乎是可以通过验证库实现的。。。