为 Express-Validator 自动生成的错误消息
Auto-generated error messages for Express-Validator
我想创建一个 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"
}
]
有没有办法获取自动生成的错误消息,或者我真的必须自己编写这些错误消息吗?
基本上,验证器试图告诉你它认为它在哪里发现了错误,并且由于它没有自定义错误字符串,它会返回到(相当丑陋的)"element/location"方案。
方法一
最合理的方法是为每个字段自定义错误消息。
看到错误消息相当重复,将它们移出验证器定义是有意义的,并且可能创建一个非常简单的 "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)
....
这样,您仍然会收到格式正确的错误消息,并且不会一遍又一遍地复制粘贴相同的字符串
方法二
您可以可以想象向验证错误添加post-处理(即获取丑陋的输出并进行一些计算并将其转换为更好的输出)。这将是一种相当困难的方法,因为您必须将规则分解为原子检查,并且您的验证方案变得很长,但仍然需要大量工作
方法 3
与其说这是一个 "approach" 建议 - 您可以切换到不同的验证器,例如 Joi,它在错误消息周围有更合理的默认逻辑
我同意 Alex 的建议,尤其是 Joi 部分。
只想再提一次机会。传递给客户端错误键代码。
示例:
usernameTooShort
这可以在客户端中处理,如果您在某个时候决定将本地化添加到您的应用程序中,这将非常有用。您将在前端有一个键值对象,它根据用户选择的语言处理消息。
祝你好运!
我想创建一个 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"
}
]
有没有办法获取自动生成的错误消息,或者我真的必须自己编写这些错误消息吗?
基本上,验证器试图告诉你它认为它在哪里发现了错误,并且由于它没有自定义错误字符串,它会返回到(相当丑陋的)"element/location"方案。
方法一
最合理的方法是为每个字段自定义错误消息。 看到错误消息相当重复,将它们移出验证器定义是有意义的,并且可能创建一个非常简单的 "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)
....
这样,您仍然会收到格式正确的错误消息,并且不会一遍又一遍地复制粘贴相同的字符串
方法二
您可以可以想象向验证错误添加post-处理(即获取丑陋的输出并进行一些计算并将其转换为更好的输出)。这将是一种相当困难的方法,因为您必须将规则分解为原子检查,并且您的验证方案变得很长,但仍然需要大量工作
方法 3
与其说这是一个 "approach" 建议 - 您可以切换到不同的验证器,例如 Joi,它在错误消息周围有更合理的默认逻辑
我同意 Alex 的建议,尤其是 Joi 部分。
只想再提一次机会。传递给客户端错误键代码。 示例:
usernameTooShort
这可以在客户端中处理,如果您在某个时候决定将本地化添加到您的应用程序中,这将非常有用。您将在前端有一个键值对象,它根据用户选择的语言处理消息。
祝你好运!