Node.js:express中间件2

125 阅读4分钟

express中间件

  • 局部生效的中间件
  • 使用中间件的5个注意事项 -中间件的分类:应用级|路由级|错误级|内置|第三方

局部生效的中间件

不使用app.use()定义的中间件,叫做局部生效的中间件
    //定义中间件函数 mw1
    const mw1 = function(){
        console.log('这里是中间件函数')
        next()
    }
    
    //局部中间件的生效方式
    app.get('./',mw1,(req,res)=>{
        res.send('Home page.')
    })
    
    //mw1不生效的路由
    app.get('/user',(req,res)=>{
        res.send('User page.')
    })
    
  //定义多个局部中间件
      //以下两种写法完全等价
   app.get('./',mw1,mw2,(req,res)=>{res.send('Home page.')})
   app.get('./',[mw1,mw2],(req,res)=>{res.send('Home page.')})
   //中间件的执行顺序是按照这里写的顺序执行

使用中间件的5个注意事项

  • 一定要在路由定义定义中间件
  • 客户端发送过来的请求,可以连续调用多个中间件进行处理
  • 执行完中间件的业务代码之后,不要忘记调用next()函数
  • 为了防止代码逻辑混乱,调用next()函数后不要再写额外的代码
  • 连续调用多个中间件时,多个中间件之间,共享req,res对象

中间件的分类

为了方便大家理解和记忆中间件的使用,express官方把常见的中间件用法,
分成了5大类,分别是
  • 应用级别的中间件
  • 路由级别的中间件
  • 错误级别的中间件
  • Express内置的中间件
  • 第三方的中间件

应用级别的中间件

通过app.use()或app.get()或app.post(),绑定到app实例上的中间件,叫做
应用级别的中间件(全局中间件,局部中间件)

路由级别的中间件

绑定到express.Router()实例上的中间件,叫做路由级别的中间件。(router.use)
        const app = express()
        //创建路由对象
        const router = express.Router()
        
        //路由级别的中间件
        router.use(function(req,res,next)=>{
            console.log('Time',Date.now())
            next()
        })
        
        //注册router路由
        app.use('/',router)
        
        

错误级别的中间件

错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误,从而防止项目
异常崩溃的问题

格式

错误级别中间件的function处理函数中,必须有四个形参,形参顺序从前到后,
分别是(err,req,res,next).
    app.get('./',(req,res)=>{
        //认为抛出一个异常
        throw new Error('服务器内部发生了错误!')   //此时整个项目崩溃亏
        //无法继续向下执行代码,服务器无法正常响应客户端
        res.send('Home Page')
    })
    
    //错误级别的中间件
    app.use((err,req,res,next)=>{
    //在服务器打印错误消息
        console.log('发生了错误'+err.message)
        //向客户端响应错误相关的内容
        res.send('Error'+err.message)
    })

注意:错误级别中间件,必须注册在所有路由之后

express内置的中间件

自express4.16.0版本开始,express内置了3个常用的中间件,极大的提高了
Express项目的开发效率和体验
  • express.static:快速托管静态资源的内置中间件,(无兼容性问题)
    • 在4.16.0版本前也可以使用
  • express.json解析JSON格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)
  • express.urlencoded解析URL-encoded格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)
    //配置解析 application/json 格式数据的内置中间件
    app.use(express.json())
    //配置解析 application/x-www-form-urlencoded 格式数据的内置中间件
    app.use(express.urlencoded({extended:false}))

express.json

向服务器发送含json格式的数据 image.png

    
    //注意:除了错误级别的中间件,其他的中间件必须在路由之前进行配置
    //通过express.json()这个中间件,解析表单中的json格式数据
    app.use(express.json)
    
    app.post('/user',(req,res)=>{
        //在服务器中,可以使用req.body这个属性,来接受客户端发送过来的请求体数据
        //默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
            console.log(req.body)
            res.send('ok')
    })

express.urlencode

向服务器发送含dx-www-form-urlencoded 格式的数据 image.png

    
    //注意:除了错误级别的中间件,其他的中间件必须在路由之前进行配置
    //通过express.json()这个中间件,解析表单中的json格式数据
    app.use(express.urlencoded({extended:false}))
    
    app.post('/book',(req,res)=>{
        //在服务器中,可以使用req.body这个属性,来接受客户端发送过来的请求体数据
        //默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
            console.log(req.body)
            res.send('ok')
    })

第三方的中间件

非Express官方内置,在项目中,可以按需下载并配置第三方中间件

在express@4.16.0之前的版本中,经常使用body-parser这个第三方中间件,解析请求体数据。使用步骤如下

  1. npm install body-parser安装中间件
  2. 使用require导入中间件
  3. 调用app.use()注册并使用中间件
    • app.use(parser.urlencoded({entended:false}))