目录
1.中间件的概念
2.Express中间件的调用流程
2.1.全局生效的中间件
2.2.局部生效的中间件
3.中间件的分类
3.1.应用级中间件
3.2.路由级中间件
3.3.错误级别的中间件
3.4.内置中间件
3.5.第三方中间件
在express.js中,中间件(middleware)是函数,可以访问请求对象(req)、响应对象(res)以及应用程序请求-响应周期中的下一个中间件函数。中间件函数可以执行以下任务:
如果当前中间件函数没有结束请求-响应周期,那必须调用 next()
函数将控制传递给下一个中间件函数,否则请求将被挂起。
当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。
Express的中间件,本质上就是一个function处理函数,Express中间件的格式如下:
const express = require('express');
const app = express();
app.use(function(req,res,next){
next();
});
app.listen(3000,{
console.log('express server is running on port 3000');
});
注意:中间件函数的形参列表中,必须包含next参数。而路由处理函数中只包含req 和res,
Express中间件可分为:·
可以使用app.use0)连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行调用,示例代码如下:
app.use(function(req,res,next){ // 第1个全局中间件
console.log('调用了第1个全局中间件');
next();
})
app.use(function(req,res,next){ // 第2个全局中间件
console.log('调用了第2个全局中间件');
next();
});
app.get('/user',function(req,res){ // 请求这个路由,会依次触发上述两个全局中间件
res.send('user');
});
局部生效的中间件是在特定的路由或路由组中使用的中间件,而不是在整个应用程序中全局使用。
const mv = function(req,res,next){
console.log('中间件函数');
next();
};
// mv这个中间件旨在”当前路由生效“,这种用法就属于”局部生效的路由“
app.get('/',mv,function(req,res){
res.send('home');
});
// mv这个中间件不会影响下面的路由
app.get('/user',function(req,res){
res.send('user');
});
定义多个局部中间件
const mv1 = function(req,res,next){
console.log('中间件函数1');
next();
};
const mv2 = function(req,res,next){
console.log('中间件函数2');
next();
};
// 以下的两种写法是“完全等价”的,可根据自己的喜好,选择任意一种方式进行使用
app.get('/',mv1,mv2,function(req,res){
res.send('home');
});
app.get('/',[mv1,mv2],function(req,res){
res.send('home');
});
在Express中,中间件可以根据用途和应用范围进行分类。主要的分类包括:
应用级中间件绑定到 `app` 实例上,应用于整个应用程序。这类中间件通常用于执行一些全局的操作,比如解析请求体、记录日志等。
const express = require('express');
const app = express();
// 应用级中间件
app.use((req, res, next) => {
console.log('应用级中间件');
next();
});
app.get('/', (req, res) => {
res.send('home');
});
app.listen(3000,()=>{
console.log('express server is running on port 3000');
});
路由级中间件绑定到 `express.Router` 实例上,应用于特定的路由或路由组。这类中间件通常用于在特定路由中执行一些操作,比如身份验证、特定路径的日志记录等。
const express = require('express');
const app = express();
const router = express.Router();
// 路由级中间件
router.use((req, res, next) => {
console.log('路由级中间件');
next();
});
router.get('/:id', (req, res) => {
res.send(`User ID: ${req.params.id}`);
});
app.use('/user', router);
app.listen(3000,()=>{
console.log('express server is running on port 3000');
});
错误级别中间件的作用:通常用于捕获和处理来自其他中间件或路由的错误,从而防止项目异常崩溃的问题。
错误处理中间件具有四个参数:`err`、`req`、`res`、`next`。
const express = require('express');
const app = express();
// 普通路由
app.get('/', (req, res) => {
throw new Error('服务器内部发生了错误!');
});
// 错误级别的中间件
app.use((err, req, res, next) => {
console.error('发生了错误:' + err.message);
res.status(500).send('Error!' + err.message);
});
app.listen(3000,()=>{
console.log('express server is running on port 3000');
});
Express 提供了一些内置中间件,用于处理常见任务,如解析请求体和提供静态文件。
常见的内置中间件:
const express = require('express');
const app = express();
// 解析 JSON 请求体
app.use(express.json());
// 解析 URL 编码请求体
app.use(express.urlencoded({ extended: true }));
// 提供静态文件
app.use(express.static('public'));
app.listen(3000,()=>{
console.log('express server is running on port 3000');
});
非Express官方内置的,第三方中间件由社区开发并提供,可以添加到 Express 应用中以实现各种功能,从而提高项目的开发效率,如处理 CORS、session 管理、请求日志记录等。
常见的第三方中间件:
const express = require('express');
const app = express();
//导入处理跨域资源共享的中间件
const cors = require('cors');
//导入解析表单数据的中间件
const parser= require('body-parser');
// 使用第三方中间件
app.use(Parser.urlencoded({ extended: true }));
app.use(cors());
app.post('/user', (req, res) => {
res.send(`Hello, ${req.body.name}`);
});
app.listen(3000, () => {
console.log('express server is running on port 3000');
});