Express.js 是一款流行的 Node.js Web 应用程序框架,它允许开发者快速构建 web 应用程序。中间件是 Express.js 中一个重要的概念,它可以在请求到达路由处理器之前或之后执行一些操作。本文将介绍如何在 Express.js 中正确使用中间件,让你的应用更加健壮、可维护、易开发。
什么是中间件?
中间件(middleware)是一种在请求到达路由处理器之前或之后,处理 HTTP 请求和响应的方式。在 Express.js 中,中间件是通过 app.use() 函数来添加的。中间件可以执行各种操作,比如:验证用户登录状态、压缩响应数据、记录日志、判断请求来源等。一个中间件可以终止请求并返回响应,或者将请求传递到下一个中间件。
让我们来看一个非常简单的例子:
app.use((req, res, next) => {
console.log('中间件执行了');
next();
});
app.get('/', (req, res) => {
res.send('Hello World!');
});在这个例子中,我们定义了一个中间件函数,并使用 app.use() 函数将它添加到 Express.js 应用程序中。在每个请求到达应用程序时,中间件函数将被执行,并输出一条消息到控制台。然后,请求被传递到下一个中间件或路由处理器。
如何正确使用中间件?
在使用中间件时,需要遵循一些最佳实践,以确保你的应用在扩展和维护方面更具有适应性和可靠性。下面是几个重要的最佳实践:
1. 在正确的位置添加中间件
在应用程序中添加中间件时,要确保它们被添加到正确的位置。考虑以下中间件:身份验证中间件、请求日志记录中间件、错误处理中间件等。这些中间件需要在路由处理器之前添加,以便对请求进行正确的处理。否则,这些中间件可能会通知错误路由处理器或跳过验证而导致安全漏洞。
app.use(express.json()); // 处理请求体
// 路由处理器
app.post('/api/user', (req, res) => {
// 处理请求
});在这个例子中,express.json() 中间件用于解析请求体,应当在路由处理器之前使用。
2. 最小化中间件的复杂性
中间件不应过于复杂,以便轻松理解、维护和重构。中间件应该专注于一个小的任务,并且只做该任务所需的工作。
// www.javascriptcn.com code example
// 不好的实现
app.use((req, res, next) => {
// 获取请求路径
const path = req.path;
// 获取会话用户
const user = req.session.user;
// 处理请求
next();
});
// 好的实现
app.use(getPathMiddleware);
app.use(getUserMiddleware);
function getPathMiddleware(req, res, next) {
const path = req.path;
console.log('请求路径:', path);
next();
}
function getUserMiddleware(req, res, next) {
const user = req.session.user;
console.log('会话用户:', user);
next();
}
// 路由处理器
app.get('/', (req, res) => {
res.send('Hello World!');
});在这个例子中,我们将获取请求路径和会话用户分离为两个简单的中间件函数,以便更好地处理和维护代码。
3. 处理错误的中间件
当应用程序出现错误时,应该把错误信息返回给客户端,或者记录到日志文件中。可以使用 app.use() 函数来定义全局错误处理中间件。
// www.javascriptcn.com code example
// 错误处理中间件
app.use((err, req, res, next) => {
// 记录错误信息到日志文件中
console.error(err.message);
// 返回错误信息到客户端
res.status(500).send('服务器错误');
});
// 路由处理器
app.get('/', (req, res) => {
// 抛出错误
throw new Error('服务器错误');
});在这个例子中,我们定义了一个全局错误处理中间件函数来记录错误信息和向客户端返回错误响应。如果路由处理器抛出了一个错误,错误处理中间件将被自动调用。
示例代码
下面是一个简单的 Express.js 应用程序,演示了如何使用中间件来处理身份验证和记录请求日志。
// www.javascriptcn.com code example
const express = require('express');
const app = express();
// 身份验证中间件
function authMiddleware(req, res, next) {
const token = req.get('Authorization');
if (!token || token !== '12345') {
return res.status(401).send('没有权限');
}
next();
}
// 请求日志记录中间件
function logMiddleware(req, res, next) {
const method = req.method;
const path = req.path;
const time = new Date();
console.log(`${time} - ${method} ${path}`);
next();
}
app.use(express.json()); // 解析请求体
app.use(authMiddleware); // 身份验证中间件
app.use(logMiddleware); // 请求日志记录中间件
// 路由处理器
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('应用程序运行在 3000 端口');
});在这个例子中,我们定义了两个中间件函数:authMiddleware 和 logMiddleware。然后,我们使用 app.use() 函数添加这些中间件到应用程序中。authMiddleware 中间件用于验证请求头中的授权令牌是否正确,如果不正确则返回一个 401 响应。logMiddleware 中间件用于记录请求时间、方法和路径。最后,我们定义了一个路由处理器来返回一个 Hello World 字符串。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d74a32a941bf7134d28171