为了账号安全,请及时绑定邮箱和手机立即绑定

Express-Validator 自动生成的错误消息

Express-Validator 自动生成的错误消息

料青山看我应如是 2021-10-29 17:04:16
我想创建一个 Express API 并使用express-validator. 目前这是我的验证中间件protected validate = async (request: Request, response: Response, next: NextFunction): Promise<void> => {    const validationErrors: Result<ValidationError> = validationResult(request);    if (!validationErrors.isEmpty()) {        response.status(422).json({ errors: validationErrors.array() });    } else {        next();    }};我的基本验证设置看起来像public persist = [    body('username')        .isString()        .withMessage('username must be of type string.')        .isLength({ min: 1 })        .withMessage('username must be at least one character long.')        .exists()        .withMessage('username is required.'),    body('password')        .isString()        .withMessage('password must be of type string.')        .isLength({ min: 1 })        .withMessage('password must be at least one character long.')        .exists()        .withMessage('password is required.'),    this.validate,];当我调用POST /users以创建新用户时,我会收到有关无效输入的详细错误响应。当我删除所有自定义错误消息时,我收到此响应[    {        "msg": "Invalid value",        "param": "username",        "location": "body"    },    {        "msg": "Invalid value",        "param": "password",        "location": "body"    }]有没有办法获得自动生成的错误消息,还是我真的必须自己编写这些错误消息?
查看完整描述

2 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

基本上,验证器试图告诉您它认为在哪里发现了错误,并且由于它没有自定义错误字符串,因此它退回到(相当丑陋的)“元素/位置”方案。


方法一

最合理的方法是为每个字段设置自定义错误消息。看到错误消息相当重复,将它们移出验证器定义是有意义的,并且可能创建一个非常简单的“getter”函数来执行一些基本模板。然后,您的代码会变得更好一些:


const MSG_TYPE_STR = '{{field}} must be of type string.'


function getMessage(fieldName: string, msgID: string): string {

   // Templating magic happens here, Regex or whatever other method you prefer

}

...


body('username')

        .isString()

        .withMessage(getMessage('username', MSG_TYPE_STR)


....

这样,您仍然会收到格式很好的错误消息,并且您不会一遍又一遍地复制粘贴相同的字符串


方法二

可以想象,您可以为验证错误添加后处理(即采用丑陋的输出并进行一些计算并将其转换为更好的输出)。这将是一种相当困难的方法,因为您必须将规则分解为原子检查,并且您的验证方案变得很长,但仍然需要大量工作


方法三

这与其说是一种“方法”,不如说是一种建议 - 您可以切换到不同的验证器,例如 Joi,它在错误消息周围具有更合理的默认逻辑


查看完整回答
反对 回复 2021-10-29
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

只想再提一个机会。传递给客户端的错误键码。例子:

用户名太短

这可以在客户端处理,如果您决定在某个时候为您的应用程序添加本地化,这将非常有用。您将在前端有一个键值对象,该对象根据用户选择的语言处理消息。

祝你好运!


查看完整回答
反对 回复 2021-10-29
  • 2 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信