📅  最后修改于: 2023-12-03 14:41:05.280000             🧑  作者: Mango
中间件是一个函数,它可以访问和修改当前应用程序的请求和响应对象。在 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 中,中间件可以分为三类:
应用级中间件是指注册到应用程序中的中间件,它们可以处理所有请求和响应。在前面的例子中,我们使用了一个应用级中间件来记录请求方法和路径。
除了通过 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 应用程序时,熟练使用中间件是非常必要的。