如果模式应该依赖于
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"
}
}
};
由于
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:请随时提供反馈。如果您知道更好的方法,请回答问题,以便我们大家都能学习。 特别是,如果专家能够回答这是否是正确的方法,我将不胜感激。我写了一些单元测试,它似乎可以完成工作,但也许我遗漏了一些东西?