快速验证器将验证提取到单独的文件中

时间:2019-02-07 15:48:37

标签: node.js express express-validator

我正在尝试使用Express Validator验证某些输入,但设置与文档中的设置不同。

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

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() });
       }
}

documentRoute

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

即时知道的检查本身就是一种中间件,因此我该如何在现有的验证器函数中处理此问题,而该函数可能还需要其他验证。

目前这还行不通,即使有效载荷也被设置为null。它应该捕获错误并返回422响应,但不是。

1 个答案:

答案 0 :(得分:1)

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);

更新:如果要处理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 :如果您有多次检查操作,并且不想膨胀您的路线定义,建议您使用schema validation