对每个接口的传入参数进行校验,是一个 Web 后端项目的必备功能,本文将介绍 koa 中如何使用joi进行数据格式检验。
安装 Joi
接下来将以对register的user进行后端数据校验为例
创建数据校验中间件
middlewares/validator.js
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | 
 
 
 function validatorMiddleware(validateFunc) {
 return async function validator(ctx, next) {
 const { error } = validateFunc(ctx.request.body);
 if (error) {
 console.log('校验器【 %s 】,数据校验失败', validateFunc.name);
 console.error(error);
 
 ctx.body = error.message || error.details[0].message;
 return;
 }
 await next();
 };
 }
 
 export default validatorMiddleware;
 
 | 
创建 User 校验规则,并校验
src/validators/user.js
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | 
 
 
 export function userValidator(data) {
 const schema = Joi.object({
 userName: Joi.string()
 .min(2)
 .max(255)
 .pattern(/^[a-zA-Z][a-zA-Z0-9_]+$/)
 .required(),
 password: Joi.string()
 .pattern(/^[a-zA-Z0-9]{3,30}$/)
 .error(new Error('密码格式不对,请重新设定')),
 repeat_password: Joi.ref('password'),
 });
 return schema.validate(data);
 }
 
 | 
注册接口使用数据校验中间件,传入 userValidator 校验 User
src/routes/user.js
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | import Router from '@koa/router';import validatorMiddleware from '../middlewares/validator';
 import { handleUserRegister } from '../controllers/user';
 import { userValidator } from '../validators/user';
 
 const router = new Router({ prefix: '/user' });
 
 router.post('/register', validatorMiddleware(userValidator), handleUserRegister);
 
 export default router;
 
 | 
更多校验方法
JSON Schema: JSON Schema 并不是某个库,只是一种标准,简单的来说就是通过 json 格式来描述数据,而 ajv 就是对 JSON Schema 的具体实现之一.
参考链接