Express--中间件

2022-08-02,

一、什么是中间件

**中间件:**就是 做中间代理的操作。大多数情况下,中间件就是在做接收到请求和发送响应中间的一系列操作。

事实上,express是一个路由和中间件的web框架,Express 应用程序基本上是一系列中间件函数的调用。

输入网址到渲染的过程:

  1. 浏览器发送请求
  2. express接受请求

中间处理的过程,就是:中间件

  1. 路由函数处理渲染(req, res)
  2. res.render渲染

二、中间件的作用

  • 执行任何代码。
  • 对请求和响应对象进行更改。
  • 结束请求/响应循环。
  • 调用堆栈中的下一个中间件函数。

三、中间件的分类

中间件也分为应用层中间件、路由中间件、内置中间件、错误处理中间件和第三方中间件。

3.1、应用层中间件

在进行路由匹配之前或再录又要继续向下执行时想做个操作,那么应用层中间件无疑是好的选择。

实例

将之前封装的 解析 GET参数来封装成一个类型req.query的中间件

封装:

// 自己封装的一个中间件:类似 `req.query`
app.use((req, res, next) => {
  try {
    let strArr = req.url.split('?')
    if (strArr.length > 0) {
      let queryStr = strArr[1]
      let queryArr = queryStr.split('&')
      let obj = {}
      queryArr.forEach(v => {
        let str = v.split('=')
        let name = str[0]
        let value = str[1]
        obj[name] = value
      })       
      // 将解析后的对象,放在req的myQuery属性上
      req.myQuery = obj
    }
  }catch (err) {
    req.myQuery = {}
  }finally {
    // 使其进入下一步
    next()
  }
})

使用:

app.get('/search', (req, res) => {
  res.json(req.myQuery)
})

3.2、路由中间件

路由级中间件和应用级中间件类似,只不过他需要绑定express.Router();

// 实例化路由模块,此路由模块相当于一个小的app实例
const router = express.Router()

总之在检测用户登录和引导用户应该访问哪个页面是,路由中间件绝对好用。

简单实例

设置一个模块为 mall商城,商城里面有首页/和商城产品列表页/list

// 实例化路由模块,此路由模块相当于一个小的app实例
const router = express.Router()

// 访问 '/mall'
router.get('/', (req, res) => {
  res.send('商城首页')
})
// 访问 '/mall/list'
router.get('/list', (req, res) => {
  res.send('商城产品列表页')
})
app.use('/mall', router)

封装实例

可以将这个模块放置在 routes这个文件夹里,这样就可以反复调用

routes --> mall.js

const express = require('express')

// 实例化路由模块,此路由模块相当于一个小的app实例
const router = express.Router()

// 在 路由中间件 也可以使用 应用层中间件
/*
router.use((req, res, next) => {
  console.log('判断是否使商城用户..')
  next()
})
*/

router.get('/', (req, res) => {
  res.send('商城首页')
})
router.get('/list', (req, res) => {
  res.send('商城产品列表页')
})

module.exports = router

在主文件调用 app.js

const mallRouter = require('./routes/mall')

app.use('/mall', mallRouter)

3.3、错误处理中间件

顾名思义,它是指当我们匹配不到路由时所执行的操作。错误处理中间件和其他中间件基本一样,只不过其需要开发者提供4个自变量参数。

app.use((err, req, res, next) => {
        res.sendStatus(err.httpStatusCode).json(err);
});

一般情况下,我们把错误处理放在最下面,这样我们即可对错误进行集中处理。

const express=require("express");

var app=express();

app.get("/",function(req,res,next){
    const err=new Error('Not Found');
    res.send("主页");
    next(err);
});

app.use("/user",function(err,req,res,next){
    console.log("用户登录");
    next(err);
},function(req,res,next){
    res.send("用户登录");
    next();
});

app.use(function(req,res){
    res.status(404).send("未找到指定页面");
});

app.listen(8080);

3.4、内置中间件

从版本4.x开始,Express不再依赖Content,也就是说Express以前的内置中间件作为单独模块,express.static是Express的唯一内置中间件。

express.static(root, [options]);

通过express.static我们可以指定要加载的静态资源。

3.5、第三方中间件

形如之前我们的body-parser,采用引入外部模块的方式来获得更多的应用操作。如后期的cookie和session。

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');

本文地址:https://blog.csdn.net/pig_is_duck/article/details/107489034

《Express--中间件.doc》

下载本文的Word格式文档,以方便收藏与打印。