📅  最后修改于: 2023-12-03 14:41:05.134000             🧑  作者: Mango
在使用 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 中的中间件,并为您的应用程序开发提供帮助。