官网:https://joi.dev/api/?v=17.3.0#introduction
新建一个文件夹validate
,在该文件夹下创建一个index.js,
做了一个的中间件
代码如下:
具体代码
const Joi = require("joi")
module.exports = {
roles(data = {}, errMsg = {}, content = "body") {
data.token = Joi.allow();//忽略token的校验
const schema = Joi.object(data)
return async function (req, res, next) {
try {
const value = await schema.validateAsync(req[content], data);
console.log(value);
next();
} catch (error) {
res.json({
code: 400,
message: error.message ? error.message : errMsg[error.details[0].context.key]
})
}
}
}
}
在路由中配置如下:
1). rule 定义校验规则
2). message 自己定义提示
//1.引入express模块
const express = require("express");
//3.引入控制层
const { login, register } = require("../controller/userContoller");
const Joi = require("joi")
//2.创建路由对象
const userRouter = express.Router();
//4.配置对应控制器的方法
userRouter.post("/login", require("../validate").roles({
name: Joi.string().min(5).max(12).required().error(new Error("用户名不合法")),//自己定义提示内容
password: Joi.string().required(),
// token:Joi.string()
}, {
password: "密码不合法", //也可以在这里 定义提示内容
name: "用户名不合法"
}), login);
userRouter.post("/reg", register);
module.exports = {
userRouter
}
JavaScript对象的规则描述语言和验证器。
引入Joi模块
cnpm i joi -D
规则
Joi.string()/Joi.number():定义只能是字符串/数字类型
Joi.alphanum():只能是字母字符串或者数字字符串
Joi.min()/max():限制字符串最大最小长度
Joi.required():此属性必填
Joi.error():自定义错误信息
Joi.regex():接收一个字符串规则验证
[Joi.string(), Joi.number()]:可以时字符串也可以是数字类型
Joi.integer():必须是整数
定义一个规则
const schema = {
username: Joi.string().alphanum().min(3).max(30).required().error(new
Error(‘自定义错误信息’)),
password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/),
access_token: [Joi.string(), Joi.number()],
birthyear: Joi.number().integer().min(1900).max(2013),
email: Joi.string().email()
};
校验
Joi.validate({ username: 'abc', birthyear: 1994 }, schema);
//或者
schema.validateAsync({ username: 'abc', birthyear: 1994 },规则)
{ allowUnknown: true } //忽略