【nodejs表单数据的中间件&错误级别的中间件】

一、下载插件

1. 安装 @escook/express-joi 中间件,来实现自动对表单数据进行验证的功能

复制代码
npm install @escook/express-joi

2. 安装 joi 包,为表单中携带的每个数据项,定义验证规则:

joi插件官网: https://joi.dev/

复制代码
npm install joi

3. 新建 /schema/user.js 用户信息验证规则模块,并初始化代码如下:

js 复制代码
const joi = require('joi')
/**
* string() 值必须是字符串
* alphanum() 值只能是包含 a-zA-Z0-9 的字符串
* min(length) 最小长度
* max(length) 最大长度
* required() 值是必填项,不能为 undefined
* pattern(正则表达式) 值必须符合正则表达式的规则
*/

// 用户名的验证规则
const username = joi.string().alphanum().min(1).max(10).required()
// 密码的验证规则
const password = joi
    .string()
    .pattern(/^[\S]{6,12}$/)
    .required()

// 注册和登录表单的验证规则对象
exports.reg_login_schema = {
    // 表示需要对 req.body 中的数据进行验证
    body: {
        username,
        password,
    },
}

4.在请求中使用

router.post('/reguser', expressJoi(reg_login_schema) , user_handler.reguser );

js 复制代码
const express = require("express");
const router = express.Router();// 创建路由对象

// 导入用户路由处理函数对应的模块
const  user_handler = require('../router_handler/user.js')

// 导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi');
// 导入需要的验证规则对象
const { reg_login_schema } = require('../schema/user')

/**
 * 注册新用户
 * 在注册新用户的路由中,声明局部中间件,对当前请求中携带的数据进行验证
 * 数据验证通过后,会把这次请求流转给后面的路由处理函数
 * 数据验证失败后,终止后续代码的执行,并抛出一个全局的 Error 错误,进入全局错误级别中间件中进行
 */
router.post('/reguser', expressJoi(reg_login_schema) , user_handler.reguser );

// 登录
router.post('/login', user_handler.login );

module.exports = router

5.在 app.js的全局错误级别中间件中,捕获验证失败的错误,并把验证失败的结果响应给客户端:

js 复制代码
const express = require('express');// 导入 express 模块
const cors = require('cors');// 导入 cors 中间件


// 创建 express 的服务器实例
const app = express()

// 配置 cors 跨域:将 cors 注册为全局中间件
app.use(cors())


// 一定要在路由之前,封装 res.cc 函数
app.use( ( req ,res ,next ) =>{
    // status 默认值为 1,表示失败的情况
    // err 的值,可能是一个错误对象,也可能是一个错误描述字符串
    res.cc = function (err,status = 1){
        res.send({
            status,
            message: err instanceof Error ? err.message : err
        })
    }

    next();
} )

// 配置解析 application /x-www-form-urlencoded 格式的表单数据的中间件:
app.use(express.urlencoded({ extended: false }))

const userRouter = require('./router/user')
app.use('/api',userRouter)

// 定义错误级别的中间件
const joi = require('@hapi/joi')
app.use(( err ,req , res , next ) => {
    // 数据校验失败
    if (err instanceof joi.ValidationError) return res.cc(err)
    // 未知错误
    res.cc(err) 
})


// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(3007, function () {
    console.log('api server running at http://127.0.0.1:3007')
})
相关推荐
阿昌喜欢吃黄桃14 天前
RocketMq事务消息原理
java·中间件·消息队列·rocketmq·mq
半夜修仙15 天前
延迟队列的介绍及常见问题
java·数据库·中间件·rabbitmq
手握风云-15 天前
一条消息的旅程:RabbitMQ 学习与实践(一)
中间件·rabbitmq
RH23121115 天前
2026.6.8Linux
java·数据库·中间件
理人综艺好会16 天前
双Token机制在实际项目中的应用与实践
中间件·token
番茄去哪了17 天前
神领物流面试题(一)
java·大数据·中间件
念何架构之路17 天前
消息中间件
中间件
都说名字长不会被发现17 天前
Spring Boot Starter 中间件账号密码加密方案设计与实现
java·spring boot·后端·中间件
瀚高PG实验室17 天前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库
之歆18 天前
Day11_Express 深入解析:从中间件到项目实战
中间件·express