【问题标题】:Auto-generated error messages for Express-ValidatorExpress-Validator 自动生成的错误消息
【发布时间】:2020-01-26 13:32:48
【问题描述】:

我想创建一个 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"
    }
]

有没有办法获得自动生成的错误消息,还是我真的必须自己编写这些错误消息?

【问题讨论】:

  • 您可以创建一个快速中间件,例如将约束作为参数作为 json 对象,它可以为您进行验证,同时正确格式化自定义消息

标签: javascript node.js typescript express express-validator


【解决方案1】:

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

方法一

最合理的方法是为每个字段设置自定义错误消息。 看到错误消息相当重复,将它们移出验证器定义是有意义的,并且可能创建一个非常简单的“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)

....

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

方法2

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

方法 3

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

【讨论】:

  • 非常感谢您的帮助,我想我会切换到 joi :)
【解决方案2】:

我同意 Alex 的建议,尤其是关于 Joi 部分。

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

用户名太短

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

祝你好运!

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2013-06-30
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多