首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动生成的Express-Validator错误消息

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

Stack Overflow用户
提问于 2019-09-26 09:42:26
回答 2查看 1K关注 0票数 1

我想要创建一个快捷API并使用express-validator验证我的请求输入。目前这是我的验证中间件。

代码语言:javascript
复制
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();
    }
};

我的基本验证设置如下

代码语言:javascript
复制
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来创建一个新用户时,我会得到关于无效输入的详细错误响应。当我删除所有自定义错误消息时,我将得到以下响应

代码语言:javascript
复制
[
    {
        "msg": "Invalid value",
        "param": "username",
        "location": "body"
    },
    {
        "msg": "Invalid value",
        "param": "password",
        "location": "body"
    }
]

有没有一种方法可以获得自动生成的错误消息,或者我真的需要自己编写这些错误消息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-26 18:20:58

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

方法1

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

代码语言:javascript
复制
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,它在错误消息方面有一个更合理的默认逻辑。

票数 2
EN

Stack Overflow用户

发布于 2019-09-27 07:02:47

我同意亚历克斯的建议,尤其是关于乔依部分的建议。

我只想再提一次机会。若要传递给客户端错误密钥代码,请执行以下操作。示例:

usernameTooShort

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

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58113953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档