express 中间件原理

在 Express 中,中间件是一个函数,它可以访问请求对象 (req)、响应对象 (res) 和应用程序的请求-响应循环中的下一个中间件函数 (next)。在 Express 应用程序中,中间件可以执行以下操作:

  • 执行任何代码。
  • 修改请求和响应对象。
  • 终止请求-响应循环。
  • 调用下一个中间件函数。

中间件函数可以在应用程序中以多种方式定义:

应用程序级别中间件

  • app.use()
  • app.METHOD()

路由级别中间件

  • router.use()
  • router.METHOD()

错误处理中间件

  • app.use(err, req, res, next)

第三方中间件
中间件函数的执行顺序由它们在应用程序中定义的顺序决定。当请求到达应用程序时,Express 会按照定义的顺序依次调用中间件函数,每个中间件函数都可以决定是继续处理请求还是将其传递给下一个中间件函数。

中间件函数可以在响应对象 (res) 上设置头信息 (res.header())、发送响应 (res.send()) 或将请求传递给下一个中间件函数 (next())。如果在中间件函数中不调用 next(),则请求-响应循环将被终止,客户端将无法得到响应。

// 实现一个简单的 Express 风格的中间件函数
function middleware(req, res, next) {
  // 在中间件函数中处理请求
  console.log('Received a request:', req.url);

  // 在中间件函数中修改响应
  res.setHeader('Content-Type', 'text/plain');
  res.write('Hello from middleware!\n');

  // 调用下一个中间件函数
  next();
}

// 创建一个 HTTP 服务器
const http = require('http');
const server = http.createServer((req, res) => {
  // 在 HTTP 服务器中使用中间件
  middleware(req, res, () => {
    // 在中间件函数中调用下一个中间件函数时执行的代码
    // 在这里发送最终的响应
    res.end('End of response.\n');
  });
});

// 启动 HTTP 服务器
const port = 3000;
server.listen(port, () => {
  console.log(`Server listening on port ${port}.`);
});

Express 中间件的原理就是通过调用中间件函数并传递请求对象 (req)、响应对象 (res) 和下一个中间件函数 (next) 来实现请求处理。每个中间件函数可以根据需要修改请求对象、响应对象或终止请求-响应循环。同时,中间件函数的执行顺序可以影响请求的处理结果。