基于快速路由器中的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(),'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(),'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,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 routerexpress-validator 实现此目标,而不必为每种类型(SME / MNC / Index)创建一条路由,并调用验证每个。用express-validatorexpress router可以完成这一点,以便在从路由中确定req.query调用验证吗?

由于我以后要添加编辑/删除功能,因此与将其保持为插入/编辑/删除的一条路由相比,这将导致6条额外的路由。

我已经坚持了好几天,所以如果有人足够友善,我将非常感激和感谢,如果可以的话,可以给出一些解决方案,否则会有更好的方法实现这一目标吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)