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

How can a function return an array of validators and also call next()?

提问人:exloser 提问时间:1/28/2023 更新时间:1/28/2023 访问量:67

问:

我需要一个函数来获取请求正文并有条件地创建将在请求上使用的验证器。我认为最好的方法是创建中间件,但我遇到了 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'),
];
JavaScript Express 回调 中间件 express-validator

评论


答:

0赞 exloser 1/28/2023 #1

如果有人遇到与我相同的问题,这是我找到的解决方案。使用 express-validator,您可以命令性地运行验证,因此我创建了您在下面看到的中间件。在我的 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 分钟的文档阅读时间!