使用 Express Validator 的简洁方法

2025-06-07

使用 Express Validator 的简洁方法

Express 验证器是用于验证快速应用程序请求的众多 npm 包之一。

我最近express validator在一个项目中偶然发现了一些挑战,我将在本文中分享。

注意:本文假设读者已经有一个 Express 项目,并且只想使用 实现验证express validator。因此,一些细节可能会被跳过。

当您访问快速验证器文档时,您会注意到示例中使用验证器的方式,如下面的代码片段所示:

// ...rest of the initial code omitted for simplicity.
const { check, validationResult } = require('express-validator')

app.post(
  '/user',
  [
    // username must be an email
    check('username').isEmail(),
    // password must be at least 5 chars long
    check('password').isLength({ min: 5 }),
  ],
  (req, res) => {
    // Finds the validation errors in this request and wraps them in an object with handy functions
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
      return res.status(422).json({ errors: errors.array() })
    }

    User.create({
      username: req.body.username,
      password: req.body.password,
    }).then(user => res.json(user))
  }
)
Enter fullscreen mode Exit fullscreen mode

查看上面的代码片段,你会注意到验证与路由定义紧密耦合。这种模式在非常简单的用例中可能还行,但当使用量扩大时,代码库的维护会变得困难,而且路由定义的可读性也会下降。

在本文中,我将展示如何使上述验证更具可读性和更易于维护。

步骤 1

创建一个名为的文件validator.js
validator.js我们将添加两个函数,其中一个函数将保存验证规则,而第二个函数将包含执行实际验证的函数。

将下面的代码片段复制到validator.js

const { body, validationResult } = require('express-validator')
const userValidationRules = () => {
  return [
    // username must be an email
    body('username').isEmail(),
    // password must be at least 5 chars long
    body('password').isLength({ min: 5 }),
  ]
}

const validate = (req, res, next) => {
  const errors = validationResult(req)
  if (errors.isEmpty()) {
    return next()
  }
  const extractedErrors = []
  errors.array().map(err => extractedErrors.push({ [err.param]: err.msg }))

  return res.status(422).json({
    errors: extractedErrors,
  })
}

module.exports = {
  userValidationRules,
  validate,
}
Enter fullscreen mode Exit fullscreen mode

第 2 步

现在重写上面的初始代码片段,我们将得到:

const { userValidationRules, validate } = require('./validator.js')
app.post('/user', userValidationRules(), validate, (req, res) => {
  User.create({
    username: req.body.username,
    password: req.body.password,
  }).then(user => res.json(user))
})
Enter fullscreen mode Exit fullscreen mode

现在,如果您尝试注册用户但不符合用户数据规范,则验证错误响应将如下所示:

{
    "errors": [
        {
            "username": "username must be an email"
        },
        {
            "password": "password must be at least 5 chars long"
        },
    ]
}
Enter fullscreen mode Exit fullscreen mode

结论

使用此方法,您可以根据需要在单独的文件中为每个路由或模块定义验证规则,然后将其与 链接起来validate middleware。这样,代码看起来更简洁、更易读、更易于维护。

本文有很多假设,因此省略了一些细节。不过,如果您有任何疑问,请随时联系我。

express validator您可以在官方文档网站上阅读更多内容

本文最初发表在我的博客上

文章来源:https://dev.to/nedsoft/a-clean-approach-to-using-express-validator-8go
PREV
使用 Sequelize 执行 CRUD
NEXT
使用 Lumen(v5.8) 构建 JWT 认证 API