express使用joi进行数据校验

官网:https://joi.dev/api/?v=17.3.0#introduction

新建一个文件夹validate,在该文件夹下创建一个index.js,
做了一个的中间件
代码如下:

image.png

具体代码

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 自己定义提示


image.png

//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 } //忽略 

你可能感兴趣的:(express使用joi进行数据校验)