对每个接口的传入参数进行校验,是一个 Web 后端项目的必备功能,本文将介绍 koa 中如何使用joi
进行数据格式检验。
安装 Joi
接下来将以对register
的user
进行后端数据校验为例
创建数据校验中间件
middlewares/validator.js
1 2 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
1 2 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
1 2 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 的具体实现之一.
参考链接