📜  ExpressJS-中间件(1)

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

ExpressJS 中间件

中间件是一个函数,它可以访问和修改当前应用程序的请求和响应对象。在 ExpressJS 中,中间件可以用来处理路由、处理错误、解析请求体等等。本文将介绍 ExpressJS 中间件的概念和用法。

中间件的基本使用

app.use() 方法可以添加中间件到 ExpressJS 应用程序中。这个方法的第一个参数可以是路径,也可以省略,表示该中间件将处理所有的请求。例如:

const express = require('express');
const app = express();

// 记录所有请求的方法和路径
app.use((req, res, next) => {
  console.log(`${req.method} ${req.path}`);
  next();
});

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000);

这个例子中,app.use() 方法注册了一个中间件,它会在每个请求到达服务器时记录请求的方法和路径,然后调用 next() 方法,将请求传递给下一个中间件或路由。

中间件的分类

在 ExpressJS 中,中间件可以分为三类:

  1. 应用级中间件
  2. 路由级中间件
  3. 错误处理中间件
应用级中间件

应用级中间件是指注册到应用程序中的中间件,它们可以处理所有请求和响应。在前面的例子中,我们使用了一个应用级中间件来记录请求方法和路径。

除了通过 app.use() 方法注册应用级中间件以外,还可以使用 app.get()app.post() 等方法来注册应用级中间件。例如:

const express = require('express');
const app = express();

app.get('/', (req, res, next) => {
  console.log('这是一个应用级中间件');
  next();
});

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000);

这个例子中,我们在 GET / 路由上注册了一个应用级中间件,它会在处理请求之前输出一段信息。

路由级中间件

路由级中间件是指注册到特定路由的中间件,它们只能处理特定的请求和响应。在 ExpressJS 中,可以使用 Router 对象来定义路由,并为每个路由注册不同的中间件。例如:

const express = require('express');
const app = express();
const router = express.Router();

// 记录所有请求的方法和路径
router.use((req, res, next) => {
  console.log(`${req.method} ${req.path}`);
  next();
});

router.get('/', (req, res) => {
  res.send('Hello World!');
});

app.use('/', router);

app.listen(3000);

这个例子中,我们创建了一个 Router 对象,为其注册一个路由级中间件和一个 GET / 路由。然后将这个路由对象通过 app.use() 注册到应用程序的 / 路径上。

错误处理中间件

错误处理中间件是一种特殊的中间件,用来处理应用程序中的错误。它们只会在发生错误时被调用,并且必须有四个参数。例如:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  throw new Error('这是一个错误');
});

app.use((err, req, res, next) => {
  console.log(err.message);
  res.status(500).send('发生了一个错误');
});

app.listen(3000);

这个例子中,我们在 GET / 路由中抛出了一个错误,然后使用 app.use() 注册一个错误处理中间件来处理这个错误。

中间件的顺序

在 ExpressJS 中,中间件的顺序非常重要。它们会按照注册的顺序依次执行,如果一个中间件没有调用 next() 方法,那么下一个中间件就不会被执行。例如:

const express = require('express');
const app = express();

app.use((req, res, next) => {
  console.log('第一个中间件');
  next();
});

app.use((req, res, next) => {
  console.log('第二个中间件');
});

app.listen(3000);

这个例子中,第一个中间件调用了 next() 方法,所以第二个中间件可以被执行。但是如果第一个中间件没有调用 next() 方法,第二个中间件就不会被执行。

中间件的链式调用

在 ExpressJS 中,多个中间件可以通过链式调用的方式注册到应用程序或路由中。例如:

const express = require('express');
const app = express();

app.use((req, res, next) => {
  console.log('第一个中间件');
  next();
}).use((req, res, next) => {
  console.log('第二个中间件');
}).get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000);

这个例子中,我们使用了链式调用的方式来注册两个应用级中间件和一个 GET / 路由。

总结

中间件是 ExpressJS 中强大的特性之一,它们可以访问和修改当前应用程序的请求和响应对象,从而实现各种功能。在应用程序中,中间件可以分为应用级中间件、路由级中间件和错误处理中间件,并且它们的顺序非常重要。在编写 ExpressJS 应用程序时,熟练使用中间件是非常必要的。