欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Express--中间件

程序员文章站 2022-06-19 10:20:06
一、什么是中间件**中间件:**就是 做中间代理的操作。大多数情况下,中间件就是在做接收到请求和发送响应中间的一系列操作。事实上,express是一个路由和中间件的web框架,Express 应用程序基本上是一系列中间件函数的调用。输入网址到渲染的过程:浏览器发送请求express接受请求中间处理的过程,就是:中间件路由函数处理渲染(req, res)res.render渲染二、中间件的作用执行任何代码。对请求和响应对象进行更改。结束请求/响应循环。调用堆栈中的下一个...

一、什么是中间件

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

事实上,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