让我来详细讲解一下“从零学习node.js之express入门(六)”的完整攻略。
一、前置知识
在开始本文之前,需要掌握以下基础知识:
- Node.js基础知识
- HTTP协议基础知识
- HTML、CSS、JavaScript基础及其开发工具的使用
- express框架的基础知识
如果您还不具备相关的基础知识,可以先查看相关的基础教程,建议先学习“从零学习node.js之express入门(一)”到“从零学习node.js之express入门(五)”相关教程,然后再来学习这篇文章。
二、什么是中间件
中间件就是为了处理请求和响应之间的一些通用逻辑,例如:日志记录、压缩、权限验证等。
其中,express的中间件是基于洋葱圈模型来实现的,请求从最外层开始,逐层进入内部中间件,最后再从内部中间件一层一层回到最外层,最终响应给客户端,整个过程就像一个洋葱圈一样,因此被称为“洋葱圈模型”。
三、如何使用中间件
在express中,使用中间件需要使用use
方法,该方法接收一个函数作为参数,该函数内部可以对请求和响应做相应的处理。
例如,下面是添加一个简单的日志中间件的示例:
const express = require('express');
const app = express();
app.use((req, res, next) => {
console.log(`请求的方式为:${req.method}`);
next();
});
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000, () => {
console.log('服务已启动,监听端口:3000');
});
在上面的代码中,我们通过app.use
方法添加了一个中间件,该中间件对请求进行了简单的日志记录,并调用了next
方法,将请求传递给下一个中间件或路由处理函数。
四、中间件的执行顺序
在express中,中间件的执行顺序非常重要,因为它会影响到整个请求处理的流程和结果。下面是中间件的执行顺序:
- 当请求发送到express服务器时,首先执行最外层的中间件。
- 中间件在执行过程中,可以选择将请求处理结果返回给客户端,或将请求转发给下一个中间件/路由处理函数。
- 如果在中间件中调用了
next
方法,请求将进入下一个匹配到的中间件/路由处理函数。 - 如果没有匹配到任何路由,将会返回404错误。
- 如果出现错误,将会进入错误处理中间件(即定义了四个参数的回调函数)。
需要注意的是,在中间件的执行过程中,如果遇到错误或中途结束请求,将会跳过后面所有的中间件和路由处理函数,直接进入错误处理中间件。
五、示例说明
示例一:使用中间件实现权限验证
在我们的应用程序中,很多路由需要验证用户的身份才能访问。这时我们就可以使用中间件来实现权限验证。
下面是一个基于cookie的简单用户验证中间件:
const express = require('express');
const app = express();
// 权限验证中间件
const authMiddleware = (req, res, next) => {
const { cookies } = req;
if (cookies && cookies.authUser) { // cookie中存在authUser字段,表示用户已登录
next(); // 请求向下传递
} else {
res.status(403).send('未授权,无法访问');
}
}
app.use(authMiddleware); // 应用该中间件
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.get('/dashboard', (req, res) => {
res.send('欢迎来到仪表盘!');
});
app.listen(3000, () => {
console.log('服务已启动,监听端口:3000');
});
在上述示例中,我们定义了一个名为authMiddleware
的中间件,该中间件会检查请求中的cookie是否包含名为authUser
的字段,只有cookie中存在该字段表示用户已经登录,则允许请求继续向下传递;否则,返回状态码为403的错误响应。
其中,app.use(authMiddleware)
方法用于应用该中间件,表示对所有路由生效。
示例二:使用多个中间件实现请求/响应日志记录和gzip压缩
在我们的应用程序中,很多路由需要实现请求/响应的日志记录和开启gzip压缩。这时我们就可以使用多个中间件来实现这些功能。
下面是一个添加多个中间件的示例:
const express = require('express');
const compression = require('compression');
const morgan = require('morgan');
const app = express();
app.use(compression()); // 开启gzip压缩
app.use(morgan('combined')); // 记录请求日志
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000, () => {
console.log('服务已启动,监听端口:3000');
});
在上述示例中,我们使用了compression
和morgan
两个中间件,compression
用于开启gzip压缩,morgan
用于记录请求日志。其中,app.use
方法用于应用中间件,表示对所有路由生效。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从零学习node.js之express入门(六) - Python技术站