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('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') } })