以前写java的时候,后端经常使用jsr303进行数据校验。现在写nodejs,经常就前端vue进行了数据校验,而后端没有进行数据校验。其实nodejs也有很方便的基于JSON Schema的数据校验库—ajv
。
ajv文档
JSONSchema: JSONSchema并不是某个库,只是一种标准,简单的来说就是通过json格式来描述数据,而ajv就是对JSONSchema的具体实现之一.
以对Register的User进行后端数据校验为例,介绍koa中如何使用ajv进行数据格式检验
1.安装ajv
npm i ajv -S
2. 新建ajv实例和校验方法
src/validator/validate.js
const Ajv = require('ajv')
const ajv = new Ajv({
// allErrors: true // 输出所有的错误(比较慢)
})
/**
* json schema 校验
* @param {Object} schema json schema 规则
* @param {Object} data 待校验的数据
*/
function validate(schema, data = {}) {
const valid = ajv.validate(schema, data)
if (!valid) {
return ajv.errors[0]
}
}
module.exports = validate
3.创建User校验规则,并校验
src/validator/user.js
const validate = require('./validate')
// 校验规则
const SCHEMA = {
type: 'object',
properties: {
userName: {
type: 'string',
pattern: '^[a-zA-Z][a-zA-Z0-9_]+$', // 字母开头,字母数字下划线
maxLength: 255,
minLength: 2
},
password: {
type: 'string',
maxLength: 255,
minLength: 3
},
}
}
/**
* 校验用户数据格式
* @param {Object} data 用户数据
*/
function userValidate(data = {}) {
return validate(SCHEMA, data)
}
module.exports = {
userValidate
}
通过userValidate方法就可以对User数据进行校验了,但是还不够方便,我们可以把校验方法当做参数,创建一个数据校验中间件,方便的校验User、Article等不同的数据对象.
4.创建数据校验中间件
middleware/validator.js
/**
* 数据校验中间件
*/
function genValidator(validateFunc) {
return async function validator(ctx, next) {
const error = validateFunc(ctx.request.body)
if (error) {
console.log('数据校验失败')
//校验失败
ctx.body = 'error'
return
}
await next()
}
}
module.exports = {
genValidator
}
5.注册接口使用数据校验中间件,传入userValidate校验User
src/routes/auth.js
const router = require('koa-router')()
router.post('/register', genValidator(userValidate), async (ctx, next) => { //注册需要进行用户数据校验
const {
userName,
password,
} = ctx.request.body
ctx.body = await register({
userName,
password,
})
})