我正在尝试使用express-validator
来验证express router
中的字段,这些字段彼此重叠,但是我想在运行服务逻辑之前对其进行验证。
流程顺其自然,我将检查req.query
来检查输入的类型,如果它是有效类型之一,则验证中间件应验证每种类型的字段,否则将返回错误的请求响应。如果所有字段均有效,则控制器将继续执行应用逻辑。问题出在类型为req.query
中,可能是任何类型,甚至是无效的类型。
我正在尝试使验证中间件在没有明确知道首先输入哪种类型的情况下运行 ,我可以创建诸如/insert/SME/:company_id
之类的路由并从验证中导出SME
中间件在路由中运行,但这似乎是一种非常糟糕的方法,因为随着类型的增加,它将导致创建更多的路由。
我已经尝试了几种方法,但为了简洁我将仅包括其中一种。该路线看起来像http://localhost:3000/company/insert/4ecbeef128c1c9092c001231?type=SME
。在我的路线index.js
中,我有:
const router = require('express').Router();
const isAuth = require('../../middleware/authMiddleware').isAuth;
const companyController = require('../../controllers/company');
const {
companyValidate,
companyValidationRules
} = require('../../middleware/companyValidation');
router.post(
'/insert/:company_id/',
isAuth,
companyValidationRules,
companyValidate,
companyController.insertCompanyEntry
);
module.exports = router;
在我的验证中间件中,我有:
const { check, query, validationResult } = require('express-validator');
const SME = [
check('company', 'Please include a valid company.')
.isString()
.trim()
.escape(),
check('amount', 'Please include a valid amount.').isString().trim().escape(),
check('date', 'Please include a valid date.').matches(
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/
)
];
const MNC = [
check('currency', 'Please include a valid currency.')
.isString()
.trim()
.escape(),
check('amount', 'Please include a valid amount.').isString().trim().escape(),
check('date', 'Please include a valid date.').matches(
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/
)
];
const index = [
check('symbol', 'Please include a valid symbol.').isString().trim().escape(),
check('amount', 'Please include a valid amount.').isString().trim().escape()
];
const companyValidationRules = (req, res, next) => {
const type = req.query.type;
const validType = ['SME', 'MNC', 'index500'];
if (!validAsset.includes(asset))
return res.json('Asset type not valid.');
if (type === 'SME') SME;
else if (type === 'MNC') MNC;
else index;
return next();
};
const companyValidate = (req, res, next) => {
const errors = validationResult(req);
console.log('errors: ' + JSON.stringify(errors));
if (errors.isEmpty()) {
return next();
}
const extractedErrors = [];
errors.array().map(err => extractedErrors.push({ [err.param]: err.msg }));
return res.status(422).json({
errors: extractedErrors
});
};
module.exports = {
companyValidationRules,
companyValidate
};
但是我尝试过的两种方法都不能正确验证字段,即使没有所有字段,validationResult也将为空。因此,我想知道是否可以在express router
和express-validator
中实现此目标,而不必为每种类型(SME / MNC / Index)创建一条路由,并调用验证每个。用express-validator
和express router
可以完成这一点,以便在从路由中确定req.query
后调用验证吗?
由于我以后要添加编辑/删除的功能,因此与将其保持为插入/编辑/删除的一条路由相比,这将导致6条额外的路由。
我已经坚持了好几天,所以如果有人足够友善,我将非常感激和感谢,如果可以的话,可以给出一些解决方案,否则会有更好的方法实现这一目标吗?