• nodejs(12)Express 中间件middleware


    中间件

      客户端的请求到达服务器时,他的生命周期是:request -- 服务器端处理 -- 响应

      在服务器端处理过程中,业务逻辑复杂时,为了便于开发维护,需要把处理的事情分成几步,这里每一步就是一个中间件,数据就是中间件的操作对象。

    定义:中间件就是一个处理函数;只不过这个函数比较特殊,包含了三个参数,分别是 reqresnext

    注意:中间件方法中的三个参数:

    • req:请求对象;

    • res:响应对象;

    • next:next是一个函数,next()可以被调用,表示调用下一个中间件方法;

    function(req,res,next){
        //...我们自己的逻辑
        next();
    }

    app.use(myrFunc) 要写在下面两句的前面

    app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));

    是因为路由后或请求静态资源后,一次请求响应的生命周期实质上已经结束,加在这后面进行请求处理,没有任何意义。

    app.use()就是加载中间件的

    测试:

    const express = require('express')
    
    const app = express()
    
    // 创建第一个中间件
    app.use(function(req, res, next) {
      console.log('第一个中间件')
      req.a = 'aaa'
      next()
    })
    
    // 创建第二个中间件 不写 next(),那么后面注册的函数就不会执行,
    app.use(function(req, res, next) {
      console.log('第二个中间件')
      res.b = 'bbb'
      next()
    })
    
    // 创建第三个中间件
    app.use(function(req, res, next) {
      console.log('第三个中间件')
      console.log(req.a)
      console.log(res.b)
      // 结束中间件的调用
      res.send('结束中间件的调用')
    })
    
    app.listen(3001, function() {
      console.log('Express server is running at http://127.0.0.1:3001')
    })

    Express 框架中对中间件的5种分类

    • 应用级别的中间件: 挂载到 app 上的中间件 app.get('URL地址', (req, res, next)=> {})

    • 路由级别的中间件: 挂载到 router 对象上的中间件 router.get('url地址', (req, res, next)=>{})

    • 错误级别的中间件: 回调函数中,有四个参数 app.use((err, req, res, next)=>{})

    • 唯一内置的中间件: express.static()

    • 第三方中间件: 非express框架提供的,需要程序员手动安装才能使用的中间件;body-parser 解析post 表单数据

    使用第三方body-parser

    const express = require('express')
    
    const app = express()
    
    // 导入解析表单数据的中间件
    const bodyParser = require('body-parser')
    // 把导入的第三方中间安装到app身上
    app.use(bodyParser.urlencoded({extended: false  })) // app.use 就是注册安装中间件
    
    app.post('/adduser', (req, res) => {
      // req.body 上存放的,就是通过 body-parser 解析出来的表单数据
      res.json(req.body)
    })
    
    
    app.listen(3001, function() {
      console.log('Express server is running at http://127.0.0.1:3001')
    })

    自己模拟中间件

    const express = require('express')
    
    const app = express()
    
    const myBodyparse = require('./04myBodyparse')
    // 专门定义一个解析表单数据的中间件
    app.use(myBodyparse)
    
    
    app.post('/adduser', (req, res) => {
      res.send(req.body)
    })
    
    app.post('/updateuser', (req, res) => {
      res.send(req.body)
    })
    
    app.listen(3001, function() {
      console.log('Express server is running at http://127.0.0.1:3001')
    })

    04myBodyparse.js

    const qs = require('querystring')
    
    module.exports = function(req, res, next) {
      let dtStr = ''
      // 只要有数据到达服务器,就会触发 data
      req.on('data', chunk => {
        dtStr += chunk
      })
      // 只要触发了 end 事件,就证明数据发送和接收完毕了
      req.on('end', () => {
        const result = qs.parse(dtStr)
        req.body = result
        console.log(req.body)
        next()
      })
    }
  • 相关阅读:
    log4j.properties 配置示例
    spark去重计数操作(代码示例)
    mysql数据库
    Mysql之sql语句操作
    mysql修改root密码的多种方法
    mysql的主从复制过程
    mysql命令用法复习笔记
    Linux下如何查看系统启动时间和运行时间安装时间
    一键系统优化15项脚本
    MongoDB
  • 原文地址:https://www.cnblogs.com/houfee/p/10366082.html
Copyright © 2020-2023  润新知