express-validator 将验证提取到单独的文件中

express-validator extracting validation into separate file

我正在尝试使用快速验证器验证一些输入,但我的设置与文档中的设置不同。

我正在验证 body.payload 是否不为 null

this.validator.document

   public document = async (req: Request, res: Response, next: NextFunction) => {
        check("payload").exists({ checkNull: true });
        try {
            validationResult(req).throw();
            next();
          } catch (err) {
            res.status(422).json({ errors: err.mapped() });
        }
    }

this.controller.document

 public document = async (req: Request, res: Response): Promise<any> => {

        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          return res.status(422).json({ errors: errors.array() });
       }
}

文档路径

     this.router.post("/:id/document",
            this.jwtGuard,
            this.validator.document,
            this.controller.document);

我知道检查本身就是一个中间件,所以我如何在我现有的验证器函数中处理它,它之前可能有一些其他验证。

目前这不起作用,即使负载设置为空。它应该捕获错误和 return 422 响应,但它不是。

validator.document中:

public document = () => check("payload").exists({ checkNull: true });

documentRoute中:

this.router.post("/:id/document",
        this.jwtGuard,
        this.validator.document(), // notice the parentheses
        this.controller.document);

Update:如果要处理validator.document中的错误,需要在声明路由时先调用check中间件:

this.router.post("/:id/document",
    this.jwtGuard,
    check("payload").exists({ checkNull: true }),
    this.validator.document,
    this.controller.document);

并且在 validator.document 中:

public document = async (req: Request, res: Response, next: NextFunction) => {
   const errors = validationResult(req);
   if (!errors.isEmpty()) {
      return res.status(422).json({ errors: errors.array() });
   }
}

更新2:如果你有多个check操作,不想让你的路由定义臃肿,我建议你使用schema validation.