Express使用express-validator

Express使用express-validator

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('name').isLength({ min: 3 }),
  check('email').isEmail(),
  check('age').isNumeric()
], (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')
  }
})
(2)
上一篇 2020年10月24日 下午11:00
下一篇 2020年10月24日 下午11:20

相关推荐

发表回复

登录后才能评论