Express中全局中间件与局部中间件的使用

 更新时间:2024年12月11日 10:54:12   作者:Peter-Lu  
本文介绍了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 路由中,middleware1 和 middleware2 都会按顺序执行,然后再由路由处理函数发送响应。

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

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

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

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

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

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

五、总结

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

到此这篇关于Express中全局中间件与局部中间件的使用的文章就介绍到这了,更多相关Express 全局中间件与局部中间件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nodejs部署到腾讯云服务器的实现(宝塔面板linux系统)

    nodejs部署到腾讯云服务器的实现(宝塔面板linux系统)

    本文主要介绍了nodejs部署到腾讯云服务器的实现(宝塔面板linux系统),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • NodeJS使用Range请求实现下载功能的方法示例

    NodeJS使用Range请求实现下载功能的方法示例

    本篇使用 NodeJS 的 HTTP 服务创建客户端,使用 Range 请求实现下载功能,本篇使用 NodeJS 的 HTTP 服务创建客户端,使用 Range 请求实现下载功能
    2018-10-10
  • Node.js实现前端后端数据传输加密解密

    Node.js实现前端后端数据传输加密解密

    这篇文章主要介绍了Node.js实现前端后端数据传输加密解密,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Node.js 使用递归实现遍历文件夹中所有文件

    Node.js 使用递归实现遍历文件夹中所有文件

    这篇文章主要介绍了Node.js使用递归实现遍历文件夹中所有文件,需要的朋友可以参考下
    2017-09-09
  • Node.js控制台彩色输出的方法与原理实例详解

    Node.js控制台彩色输出的方法与原理实例详解

    这篇文章主要给大家介绍了关于Node.js控制台彩色输出的方法与原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Node.js具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • nodejs部署到腾讯云的实现方法

    nodejs部署到腾讯云的实现方法

    本文主要介绍了nodejs部署到腾讯云的实现方法,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 从零学习node.js之利用express搭建简易论坛(七)

    从零学习node.js之利用express搭建简易论坛(七)

    这篇文章主要介绍了node.js利用express搭建简易论坛的方法,我们需要搭建的这个简易的论坛主要的功能有:注册、登录、发布主题、回复主题。下面我们来一步步地讲解这个系统是如何实现的,需要的朋友可以参考借鉴。
    2017-02-02
  • node.js中的path.sep方法使用说明

    node.js中的path.sep方法使用说明

    这篇文章主要介绍了node.js中的path.sep方法使用说明,本文介绍了path.sep的方法说明、语法、使用实例,需要的朋友可以参考下
    2014-12-12
  • express框架,报错:“Cannot set headers after they are sent to the client”,解决方法总结

    express框架,报错:“Cannot set headers after t

    这篇文章主要介绍了express框架,报错:“Cannot set headers after they are sent to the client”,解决方法,结合实例形式总结分析了常见的问题原因与对应的解决方案,需要的朋友可以参考下
    2023-05-05
  • node.js readline和line-reader逐行读取文件方法

    node.js readline和line-reader逐行读取文件方法

    Readline是Node的原生模块。它是专门为从任何可读流逐行读取内容而开发的。它可用于从命令行读取数据,line-reader模块是Node.js中逐行读取文件的开源模块。它不是本地模块,所以你需要使用npm(节点包管理器)安装它
    2022-10-10

最新评论