📜  Express.js 中的中间件(1)

📅  最后修改于: 2023-12-03 14:41:05.134000             🧑  作者: Mango

Express.js 中的中间件

在使用 Express.js 开发 Web 应用程序的过程中,中间件是一个非常重要的概念。中间件允许我们将处理请求的逻辑封装在函数中,并在请求到达目标路由之前或之后进行预处理或后处理。在本文中,我们将探讨 Express.js 中的中间件,包括什么是中间件、中间件的种类和如何编写和使用它们。

什么是中间件?

在 Express.js 中,中间件是一个被注册的函数,可以访问请求对象(req)、响应对象(res)和应用程序中的下一个函数(next)。当一个请求到达应用程序时,它将按照定义的路由进行匹配并找到匹配的处理程序。但在匹配的处理程序之前,请求会被传递给所有注册的中间件函数进行预处理或者后处理。

在 Express.js 中,中间件不仅可以处理请求,还可以改变请求或响应对象本身,而且可以决定是否让请求继续向下传递到下一个中间件或路由。

中间件的种类

在 Express.js 中,有4种不同类型的中间件,它们分别是:

应用级中间件

应用级中间件绑定到应用程序对象(app)并可以处理在该应用程序上发生的每个请求。要定义应用级中间件,可以使用 app.use() 方法。

app.use(function(req, res, next) {
  console.log('Time:', Date.now());
  next();
});

在上面的代码中,我们定义了一个打印请求时间的中间件,每次请求到达应用程序时都会执行该中间件。

路由级中间件

路由级中间件绑定到特定的路由并仅处理该路由上的请求。要定义路由级中间件,可以使用与定义路由处理程序相同的方法。

var router = express.Router();

// 定义路由级中间件
router.use(function(req, res, next) {
  console.log('Time:', Date.now());
  next();
});

// 定义路由处理程序
router.get('/', function(req, res) {
  res.send('Hello World!');
});

// 将路由挂载到应用程序
app.use('/', router);

在上面的代码中,我们定义了一个打印请求时间的路由级中间件,并将它绑定到路径为 '/' 的路由上。

错误处理中间件

错误处理中间件用于处理在应用程序中发生的错误。当在应用程序中调用 next() 方法时并且传递了一个错误对象时,就会触发错误处理中间件。要定义错误处理中间件,可以使用与定义其他中间件相同的方法,并接收错误对象作为其第一个参数。

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

在上面的代码中,我们定义了一个错误处理中间件,当应用程序中有错误时,它将打印错误栈并发送一个 HTTP 500 响应。

内置中间件

Express.js 还附带了一些内置的中间件,包括:

  • express.json()

    使用 body-parser 中间件将 HTTP POST 请求体解析为 JSON 格式。

  • express.urlencoded()

    使用 body-parser 中间件将 HTTP POST 请求体解析为 URL 编码格式。

  • express.static()

    提供静态文件服务,将目录中的文件发送到客户端,例如 CSS、JavaScript 或图像文件。

编写和使用中间件

要编写中间件,您需要创建一个函数,并将其作为参数传递给 app.use() 或路由处理程序的回调函数。您的中间件可以执行任何您喜欢的操作,包括修改请求或响应对象、调用下一个中间件或终止处理流程。

例如,以下是一个将当前用户信息添加到请求对象的中间件的示例:

app.use(function(req, res, next) {
  req.user = { name: 'John', age: 30 };
  next();
});

在上面的代码中,我们定义了一个名为 req.user 的新属性,并将其设置为名为 'John' 年龄为 30 的用户对象。不同的中间件可以访问和修改 req.user 属性,并根据需要传递该值。

在一个中间件中调用 next() 方法将调用下一个中间件或路由处理程序。如果不调用 next(),请求处理流程将在该中间件中终止。例如,以下是一个中间件,如果请求的 URL 中不包含查询参数,则会终止处理流程并发送一个错误响应:

app.use(function(req, res, next) {
  if (!req.query.q) {
    res.status(400).send('Missing query parameter');
  } else {
    next();
  }
});

在上面的代码中,我们检查请求的 URL 是否包含名为 'q' 的查询参数,如果没有,则发送一个 HTTP 400 响应并终止处理流程。

结论

中间件是 Express.js 中的一个重要概念,它允许我们在请求到达目标路由之前或之后进行预处理或后处理。本文介绍了 Express.js 中的四种中间件类型,包括应用级中间件、路由级中间件、错误处理中间件和内置中间件。

通过编写和使用中间件,我们可以将请求处理逻辑封装在函数中,提高应用程序结构的灵活性和可读性。希望本文能够帮助您更好地理解 Express.js 中的中间件,并为您的应用程序开发提供帮助。