express-validator 中的动态模式选择

问题描述 投票:0回答:1

如果模式应该依赖于

checkSchema
,我该如何使用
body
函数?

例如,如果

Type
是“A”,则必须在正文中提供
SomeData
,但如果
Type
是其他内容,则此规则不适用。

const schemaForAllTypes = {
    Type: {
        in: 'body',
        notEmpty: {
            errorMessage: "'Type' has to be provided in body"
        }
    }
};

const schemaForTypeA = {
    Type: {
        in: 'body',
        notEmpty: {
            errorMessage: "'Type' has to be provided in body"
        }
    },
    SomeData: {
        in: 'body',
        notEmpty: {
            errorMessage: "'SomeData' has to be provided in body"
        },
        isJSON: {
            errorMessage: "'SomeData' has to be JSON"
        }
    }
};


express-validator
1个回答
0
投票

由于

checkSchema(...)
返回一个包含所有验证规则(作为函数)和
run
函数的对象,因此可以实现动态模式验证,如下所示:

const validateSchemaDynamically = () => async (req, res, next) => {
    // to choose the schema dynamically, we need the type
    const { Type } = req.body;
    switch (Type) {
        case 'A':
            const schema = {
                ...BaseSchema,
                SomeData: {
                    in: 'body',
                    notEmpty: {
                        errorMessage: "'SomeData' has to be provided in body"
                    },
                    isJSON: {
                        errorMessage: "'SomeData' has to be JSON"
                    }
                }
            };

            await checkSchema(schema).run(req);
            return next();
        default:
            await checkSchema(BaseSchema).run(req);
            return next();
    }
};

router.post(
    '/my-endpoint',
    validateSchemaDynamically(),
    handleValidationErrors(), // middleware to check (and handle) validation errors
    async (req, res) => {
        console.log('Business logic here...');
        return res.status(202).send();
    }
);

PS:请随时提供反馈。如果您知道更好的方法,请回答问题,以便我们大家都能学习。 特别是,如果专家能够回答这是否是正确的方法,我将不胜感激。我写了一些单元测试,它似乎可以完成工作,但也许我遗漏了一些东西?

© www.soinside.com 2019 - 2024. All rights reserved.