【Node.js】Express---全局中间件与局部中间件详解

Express 是 Node.js 生态系统中最流行的 Web 应用框架之一,提供了简洁的 API,便于开发者创建 Web 应用程序和 RESTful API。本文将详细介绍 Express 中的全局中间件与局部中间件,帮助开发者更好地理解两者的区别、用法以及在实际项目中的应用场景。

一、Express 中的中间件概述

1. 什么是中间件?

中间件(middleware)是 Express 应用程序中处理请求的函数,通常用于处理 HTTP 请求和响应的过程。中间件可以访问请求对象(req)、响应对象(res)以及应用程序的下一个中间件函数。其主要作用是处理请求数据、进行身份验证、记录日志、处理错误等。

中间件可以通过以下三种方式应用:

  • 全局中间件:在应用程序中全局生效,所有请求都会经过该中间件。
  • 局部中间件:只作用于特定的路由或请求。
  • 错误处理中间件:专门用于捕获和处理错误。

2. Express 中的中间件执行顺序

在 Express 中,中间件是按照定义的顺序依次执行的。当一个中间件处理完毕后,可以通过调用 next() 函数将控制权传递给下一个中间件。如果不调用 next(),则请求将会挂起,后续的中间件或路由不会被执行。

二、全局中间件的作用与用法

1. 什么是全局中间件?

全局中间件是指在应用程序启动时注册的中间件,这些中间件对所有路由和请求生效。通常用于一些通用的处理逻辑,比如解析请求体、处理静态文件、添加全局响应头等。

2. 常见的全局中间件示例

以下是一些常用的全局中间件示例:

(1) 解析 JSON 请求体的中间件

Express 内置了 express.json() 中间件,用于解析请求体中的 JSON 数据:

const express = require('express');
const app = express();

// 全局解析 JSON 请求体
app.use(express.json());

app.post('/data', (req, res) => {
  res.send(req.body);  // 输出解析后的 JSON 数据
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});
(2) 日志记录中间件

开发者可以使用第三方中间件如 morgan 来记录 HTTP 请求日志:

const express = require('express');
const morgan = require('morgan');
const app = express();

// 全局日志记录中间件
app.use(morgan('combined'));

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});
(3) 静态文件处理中间件

使用 express.static() 处理静态文件请求:

const express = require('express');
const app = express();

// 全局处理静态文件
app.use(express.static('public'));

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,public 目录下的文件可以通过 / 直接访问,例如 public/index.html 可以通过 http://localhost:3000/index.html 访问。

3. 全局中间件的使用场景

全局中间件通常用于以下场景:

  • 请求解析:如解析 JSON、URL 编码的数据等。
  • 身份验证:对所有路由进行身份验证或权限校验。
  • 请求日志:记录所有请求的详细信息。
  • 错误处理:全局捕获应用程序中的错误。

三、局部中间件的作用与用法

1. 什么是局部中间件?

局部中间件是指仅在特定路由或一组路由中生效的中间件。这种中间件只会在匹配到特定路由时执行,适用于那些只针对部分路由进行的处理逻辑。

2. 局部中间件的定义与使用

局部中间件的定义通常是在路由处理函数之前,作为参数传递给路由。以下是一个简单的示例:

const express = require('express');
const app = express();

// 局部中间件函数
const checkAuth = (req, res, next) => {
  const auth = req.headers.authorization;
  if (auth === 'secret-token') {
    next();  // 如果验证通过,继续处理下一个中间件或路由
  } else {
    res.status(403).send('Forbidden');  // 否则返回 403
  }
};

// 在特定路由中使用局部中间件
app.get('/protected', checkAuth, (req, res) => {
  res.send('This is a protected route');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,checkAuth 中间件只对 /protected 路由生效,用于验证请求头中的 authorization 是否匹配。

3. 多个局部中间件的使用

Express 支持在单个路由中使用多个局部中间件。可以通过链式调用来实现这一点:

const express = require('express');
const app = express();

const middleware1 = (req, res, next) => {
  console.log('Middleware 1');
  next();
};

const middleware2 = (req, res, next) => {
  console.log('Middleware 2');
  next();
};

app.get('/example', middleware1, middleware2, (req, res) => {
  res.send('Hello from /example route');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

/example 路由中,middleware1middleware2 都会按顺序执行,然后再由路由处理函数发送响应。

4. 局部中间件的使用场景

局部中间件通常用于以下场景:

  • 特定路由的权限验证:如用户权限验证或 API Key 验证。
  • 特定请求的预处理:如为某些路由添加自定义的请求头或参数。
  • 路由日志记录:只记录某些敏感路由的请求日志。

四、全局中间件与局部中间件的区别

全局中间件与局部中间件的主要区别在于它们的作用范围:

特性全局中间件局部中间件
作用范围对所有请求生效只对特定路由或请求生效
典型用途解析请求体、处理静态文件、身份验证等权限验证、参数处理、日志记录等
执行顺序按照在应用程序中注册的顺序执行按照在路由中定义的顺序执行
应用场景通用功能,如请求解析、错误处理等特定场景,如单一路由的权限验证等

五、总结

在 Express 应用程序中,全局中间件与局部中间件各有用途。全局中间件用于处理那些适用于整个应用程序的通用逻辑,如请求体解析、日志记录等。而局部中间件则可以在特定路由中应用,提供更精细化的控制,如路由权限验证或请求预处理。

推荐:


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter-Lu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值