Express使用express-validator

作者: adm 分类: node 发布时间: 2023-03-18

在Express中验证传入的数据。

假设您有一个POST接口,它接受名称、电子邮件和年龄参数:

const express = require('express')
const app = express()

app.use(express.json())

app.post('/form', (req, res) => {
  const name  = req.body.name
  const email = req.body.email
  const age   = req.body.age
})

如何执行服务器端验证这些结果,以确保:

名字是至少3个字符的字符串?
电子邮件是真正的电子邮件?
年龄是一个数字,在0到110之间?
在Express中处理来自外部的任何类型输入的验证的最好方法是使用Express -validator包:

npm install express-validator

你引入validationResult和check对象:

const { check, validationResult } = require('express-validator');

我们传递了一个check()调用数组作为post()调用的第二个参数。每个check()调用都接受参数名作为参数。然后调用validationResult()来验证没有验证错误。如果有,我们会告诉用户:

app.post('/form', [
  check('mobile').matches(/^(13|14|15|16|17|18|19)\d{9}$/).withMessage("手机号格式不正确"),
  check('name').isLength({ min: 3 }),
  check('email').isEmail(),
  check('age').isNumeric().withMessage("类型不正确")
], (req, res) => {
  const errors = validationResult(req)
  if (!errors.isEmpty()) {
    return res.status(422).json({ errors: errors.array() })
  }

  const name  = req.body.name
  const email = req.body.email
  const age   = req.body.age
})

注意我使用的:

isLength ()
isEmail ()
isNumeric ()

还有很多这样的方法,都来自validator.js,包括:

contains()
equals()
isAlpha()
isAlphanumeric()
isAscii()
isBase64()
isBoolean()
isCurrency()
isDecimal()
isEmpty()
isFQDN()
isFloat()
isHash()
isHexColor()
isIP()
isIn()
isInt()
isJSON()
isLatLong()
isLength()
isLowercase()
isMobilePhone()
isNumeric()
isPostalCode()
isURL()
isUppercase()
isWhitelisted()

可以使用matches()针对正则表达式验证输入。

日期也可以检查,使用:

isAfter(),检查输入的日期是否在您传递的日期之后
isBefore(),检查输入的日期是否在您通过的日期之前
isISO8601 ()
isRFC3339 ()

关于如何使用这些验证器的详细信息,请参考https://github.com/chriso/validator.js#validators。

所有这些检查可以通过管道连接它们:

check('name')
  .isAlpha()
  .isLength({ min: 10 })

如果有任何错误,服务器会自动发送一个响应来传递错误信息。例如,如果电子邮件是无效的,这是什么将返回:

{
  "errors": [{
    "location": "body",
    "msg": "Invalid value",
    "param": "email"
  }]
}

使用withMessage()可以覆盖每次检查时的默认错误:

check('name')
  .isAlpha()
  .withMessage('Must be only alphabetical chars')
  .isLength({ min: 10 })
  .withMessage('Must be at least 10 chars long')

如果您想编写自己的特殊的、自定义的验证器呢?您可以使用自定义验证器。

在回调函数中,你可以通过抛出一个异常或返回一个被拒绝的承诺来拒绝验证:

app.post('/form', [
  check('name').isLength({ min: 3 }),
  check('email').custom(email => {
    if (alreadyHaveEmail(email)) {
      throw new Error('Email already registered')
    }
  }),
  check('age').isNumeric()
], (req, res) => {
  const name  = req.body.name
  const email = req.body.email
  const age   = req.body.age
})

自定义验证器:

check('email').custom(email => {
  if (alreadyHaveEmail(email)) {
    throw new Error('Email already registered')
  }
})

可以改写为:

check('email').custom(email => {
  if (alreadyHaveEmail(email)) {
    return Promise.reject('Email already registered')
  }
})

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!