Skip to content

中间件

何为中间件

  • 中间件(Middleware)本质是一个回调函数。
  • 中间件函数可以像路由回调函数一样,会收到:
  • 中间件类似于一道道“”,用于完成一系列任务,如验证、日志记录、数据处理等。

中间件分类

  1. 全局中间件
  2. 路由中间件

全局中间件

每个请求到达服务端之后,都会执行全局中间件,在全局中间件中可以编写额外的处理逻辑。

定义中间件

js
function middle1(request, response, next) {
  //实现功能代码
  //.....
  //执行 next 函数(当如果希望执行完中间件函数之后,
  //仍然继续执行路由中的回调函数,必须调用 next)
  next();
}

使用中间件

js
//使用中间件
app.use(middle1);

app.get("/demo", (request, response) => {
  console.log(request);
  response.send("ok");
});

匿名写法

js
app.use(function (request, response, next) {
  console.log("定义第一个中间件");
  next();
});

多个中间件

js
function middle1(request, response, next) {
  //实现功能代码
  /*******/
  next();
}

function middle2(request, response, next) {
  //实现功能代码
  /*******/
  next();
}

app.use(middle1);
app.use(middle2);

路由中间件

如果只需要对某一些路由进行功能封装,则就需要路由中间件

js
app.get("/路径", `中间件函数1`, `中间件函数2`, (request, response) => {
  /*******/
});

中间件实例应用

静态资源

js
const express = require("express");
const app = express();

//静态资源中间件的设置,将当前文件夹下的 public 目录作为网站的根目录
app.use(express.static("./public"));

/*
如果访问的内容经常变化,还是需要设置路由
但是,在这里有一个问题,如果public目录下有index.html文件,单独也有 index.html 的路由,
则谁书写在前,优先执行谁
*/
app.get("/index.html", (request, response) => {
  respsonse.send("首页");
});

//监听端口
app.listen(8088, () => {
  console.log("8088 端口启动....");
});

注意

  1. 文件为默认打开的资源。
  2. 如果静态资源与路由规则同时匹配,谁先匹配谁就响应。
  3. 路由响应动态资源,静态资源中间件响应静态资源。

解析请求
使用 中间件解析请求体。

js
//处理 querystring 格式的请求体
let urlParser = express.urlencoded({ extended: false });
//处理 JSON 格式的请求体
let jsonParser = express.json();

设置路由中间件,然后使用 来获取请求体数据。

js
app.post("/login", urlParser, (request, response) => {
  //获取请求体数据
  //console.log(request.body);
  //用户名
  console.log(request.body.username);
  //密码
  console.log(request.body.userpass);
  response.send("获取请求体数据");
});

获取到的请求体数据:

json
{
  "username": "admin",
  "userpass": "123456'"
}