Node.js express路由器中基于req.query的express验证中间件
我正在尝试使用Node.js express路由器中基于req.query的express验证中间件,node.js,express,express-validator,Node.js,Express,Express Validator,我正在尝试使用express validator验证express router中的字段,这些字段彼此稍微重叠,但我希望在运行服务逻辑之前验证它们 流程如下:我将检查req.query以检查输入的类型,如果它是有效类型之一,则验证中间件应验证每个类型的字段,如果不是,则只返回错误的请求响应。如果所有字段都有效,则控制器将继续应用程序逻辑。当类型位于req.query中时出现问题,它可能是任何类型,甚至可能是无效类型 我试图让验证中间件在不明确知道首先输入的是哪种类型的情况下运行,我可以创建一个路
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)创建一条路由并为每种类型调用验证。这是否可以通过快速验证程序
和快速路由器
来完成,以便在从路由确定请求查询
后调用验证
因为我想在以后添加编辑/删除的功能,这将导致6条额外的路由,而如果我只保留一条用于插入/编辑/删除
我已经被困在这个问题上好几天了,所以如果有人对我很好,能给我一些建议来解决这个问题,我会非常感激,如果可能的话,否则有更好的方法来解决这个问题吗