在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
})
如何执行服务器端验证这些结果,以确保:
在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
})
注意我使用的:
还有很多这样的方法,都来自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()针对正则表达式验证输入。
日期也可以检查,使用:
关于如何使用这些验证器的详细信息,请参考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')
}
})