javascript 一个函数如何返回一个验证器数组并调用next()?

w41d8nur  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(81)

我需要一个函数来获取请求主体并有条件地创建将在请求中使用的验证器。我认为最好的方法是创建中间件,但我遇到了express-validator的问题。要使express-validator工作,中间件必须返回我的验证器数组,但如果我这样做,我就不能调用next(),请求也得不到处理。

// This will fail because I can't call next
const validatorMiddleware = (req, res, next) => {
  const {
    isFooRequired,
    isBarRequired,
  } = req.body;

  return concat(
    isFooRequired && createValidator('foo'),
    isBarRequired && createValidator('bar'),
  )
 }

按照我的方法,我基本上需要一个调用next()并返回验证器数组的函数。
我知道express-validator有一种方法可以有条件地添加验证规则,但是似乎没有一种简单的方法可以批量添加验证规则。如果你问我的话,我必须对每个验证链单独进行验证,这是一个巨大的痛苦和恶心。我有几个依赖于大量验证的可选字段,我想做这样的事情:

const addressValidators = (service) => [
    body(`${service}.address.lineOne`).notEmpty().withMessage('Address cant be empty'),
    body(`${service}.address.city`).notEmpty().withMessage('city cant be empty'),
    body(`${service}.address.state`).isIn(allowedStates).withMessage('invalid state'),
  body(`${service}.address.zipCode`).isPostalCode('US').withMessage('invalid zip code'),
];
ghg1uchk

ghg1uchk1#

如果有人遇到了同样的问题,我找到了一个解决方案。使用express-validator,你可以run validations imperatively,所以我创建了下面的中间件。在我的constructValidators函数中,我使用请求主体来查看哪些字段存在,并相应地创建我的验证链。

const validateMiddleware = async (req, res, next) => {
const validationList = constructValidators(req.body);

await Promise.all(validationList.map((validation) => validation.run(req)));

const errors = validationResult(req);
if (errors.isEmpty()) {
  return next();
}

res.status(400).json({ errors: errors.array() });
return null;

};
请记住,3小时的故障排除可以为您节省10分钟的阅读文档时间!

相关问题