Skip to content

说说 express middleware(中间件) 的工作原理

Posted on:2024年8月14日 at 19:43

1. 中间件的定义

中间件是一个函数,它接收请求对象 (req)、响应对象 (res) 和一个 next 函数。中间件函数可以对请求进行处理、修改响应、终止请求-响应周期,或者将请求传递给下一个中间件。

2. 中间件的使用

中间件在 Express 应用程序中通过 app.use() 或者其他 HTTP 方法 (app.get(), app.post(), 等) 被注册。它们会按顺序执行。

3. 中间件工作流程

  1. 请求到达

    • 当一个 HTTP 请求到达 Express 应用时,请求会从顶部开始传递给中间件链中的第一个中间件函数。
  2. 中间件执行

    • 每个中间件函数可以对请求进行处理,比如修改请求对象 (req)、响应对象 (res),或者执行某些操作(如日志记录、身份验证等)。
    • 中间件可以通过调用 next() 函数将控制权传递给下一个中间件函数。如果不调用 next(),请求-响应周期会被中断,响应不会发送给客户端。
  3. 传递到下一个中间件

    • 控制权转移到下一个中间件函数,直到所有中间件都执行完成,或者找到一个能够终止请求-响应周期的中间件。
    • 如果请求没有被终止且所有中间件都执行完成,Express 会将请求传递到定义的路由处理函数(如果有的话),最后发送响应给客户端。
  4. 响应处理

    • 最终的响应由最后一个中间件或路由处理函数生成并发送给客户端。如果某个中间件终止了请求-响应周期(比如通过 res.send()res.end()),则后续的中间件将不会被执行。

4. 中间件类型

  1. 应用级中间件

    • 使用 app.use() 注册的中间件,它们可以是所有路由的通用中间件,也可以针对特定路径。
    • 示例:
      app.use((req, res, next) => {
        console.log("Request received");
        next();
      });
      
  2. 路由级中间件

    • 绑定到特定路由的中间件,仅在请求匹配到指定路由时才会执行。
    • 示例:
      app.get("/user/:id", (req, res, next) => {
        console.log("User ID:", req.params.id);
        next();
      });
      
  3. 错误处理中间件

    • 用于处理错误的中间件,通常有四个参数 (err, req, res, next)。
    • 示例:
      app.use((err, req, res, next) => {
        console.error(err.stack);
        res.status(500).send("Something broke!");
      });
      
  4. 内置中间件

    • Express 内置的中间件,如 express.json()express.static()
    • 示例:
      app.use(express.json()); // 解析 JSON 请求体
      app.use(express.static("public")); // 提供静态文件
      
原文转自:https://fe.ecool.fun/topic/3d4f17ec-2091-4826-8e11-d79363a9cb89