如何在express-validator的.withMessage()中使用请求体动态值
实现方法
express-validator 的 .withMessage() 方法支持传入函数作为参数,函数运行时会自动注入包含当前校验上下文的对象,可直接从中获取当前字段的用户输入值,无需手动访问req.body。
上下文对象的常用属性如下:
value:当前字段经过校验链前置方法(比如你配置的trim())处理后的实际输入值req:原始请求对象path:当前校验的字段名location:字段所在的请求位置(body/query/params等)
修改后的校验链代码如下:
check('username') .trim() .not() .isEmpty() .withMessage('username can\'t be empty') .bail() .matches("^[a-zA-Z0-9]([._-](?![._-])|[a-zA-Z0-9]){3,18}[a-zA-Z0-9]$") .withMessage((value, { path }) => { return { errorCode: '234', field: path, value: value, msg: `Username : [${value}] is an invalid username pattern, please check the rules for valid usernames` } })
注意:由于
.trim()放在校验链靠前位置,这里拿到的value是已经去除首尾空格的内容,和实际参与正则匹配的值完全一致,不会出现提示值和校验值不匹配的问题。
校验失败后返回响应时,直接从校验结果中取结构化的msg内容即可,示例逻辑:
const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).send(errors.array()[0].msg); }
当用户输入$@#时,返回的响应结构和预期完全一致:
{ "errorCode" : "234", "field" : "username", "value" : "$@#", "msg" : "Username : [$@#] is an invalid username pattern, please check the rules for valid usernames" }
内容的提问来源于stack exchange,提问作者Anshul
相关产品推荐
相关产品推荐

