我正在尝试使用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响应,但不是。
答案 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。