Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Joi-默认情况下是否生成所需的所有内容?_Javascript_Node.js_Validation_Joi - Fatal编程技术网

Javascript 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(),

我正在构建一个Node/Express API,并使用Joi进行验证。这是一个很棒的软件包,非常有用。然而,我们已经厌倦了这样的事情:

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,因为它似乎是可以通过验证库实现的。。。