当前位置: 首页 > news >正文

Express 中间件

在构建 Web 应用程序时,中间件(Middleware)扮演着至关重要的角色。它允许你定义一系列的函数来处理 HTTP 请求和响应过程中的各种任务。Express.js 是 Node.js 上最流行的框架之一,以其简洁且强大的中间件机制著称。本文将深入探讨如何使用 Express 中间件来增强你的应用功能。

什么是中间件?

中间件是介于客户端请求与服务器响应之间的一系列处理函数。每个中间件都可以访问请求对象(req)、响应对象(res),以及应用程序的请求-响应循环中的下一个中间件函数 next()。这些中间件可以执行以下操作:

  • 执行任意代码。
  • 修改请求和响应对象。
  • 结束请求-响应循环。
  • 调用堆栈中的下一个中间件。

如果当前中间件没有结束循环,则必须调用 next() 方法将控制权传递给下一个中间件,否则请求将被挂起。

基本概念与使用

定义中间件

在 Express 中,你可以非常容易地创建一个中间件函数。下面是一个简单的例子:

const express = require('express');
const app = express();app.use((req, res, next) => {console.log('Time:', Date.now());next();
});app.get('/', (req, res) => {res.send('Hello World!');
});app.listen(3000, () => console.log('Server is running on port 3000'));

在这个例子中,我们定义了一个中间件,它会在每次请求到达时记录当前时间,然后通过调用 next() 将控制权交给下一个中间件或路由处理器。

应用级中间件

使用 app.use()app.METHOD()(其中 METHOD 可以是 get、post 等 HTTP 方法)可以加载应用级中间件。例如,我们可以为所有 GET 请求添加日志记录:

app.use('/api', (req, res, next) => {console.log('API request received.');next();
});

这会将中间件应用于 /api 路径下的所有请求。

路由级中间件

除了应用级中间件外,还可以为特定路由定义中间件。这可以通过 Router 对象实现:

const apiRouter = express.Router();apiRouter.use((req, res, next) => {console.log('API specific middleware');next();
});apiRouter.get('/users', (req, res) => {res.send('List of users');
});app.use('/api', apiRouter);

这样做的好处是可以将相关的路由和中间件组织在一起,便于维护。

常见中间件类型

静态文件服务

Express 提供了内置中间件 express.static 来提供静态文件服务,如 HTML 页面、CSS 文件和 JavaScript 文件等。

app.use(express.static('public'));

这里假设你的项目根目录下有一个名为 public 的文件夹,里面存放了所有的静态资源。

解析请求体

为了方便处理 POST 请求的数据,Express 提供了两个中间件:express.json()express.urlencoded()

  • express.json():用于解析 JSON 格式的请求体。
  • express.urlencoded():用于解析 URL 编码格式的请求体。
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

错误处理中间件

错误处理中间件需要四个参数 (err, req, res, next),通常放在所有常规中间件之后。

app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Something broke!');
});

当其他中间件或路由抛出错误时,这个错误处理中间件会被触发。

第三方中间件

Express 生态系统中有大量的第三方中间件可供选择,它们可以帮助你快速实现诸如身份验证、压缩、缓存等功能。

使用 Morgan 记录 HTTP 请求

Morgan 是一个流行的 HTTP 请求日志中间件。

首先安装 Morgan:

npm install morgan --save

然后在你的应用中使用它:

const morgan = require('morgan');
app.use(morgan('dev'));

这将在开发模式下输出简短的日志信息。

使用 Body-parser 处理表单数据

尽管 express.urlencoded() 已经足够处理大多数情况下的表单数据,但在某些情况下你可能还需要使用 body-parser 进行更复杂的处理。

npm install body-parser --save

接着在你的应用中引入并配置 body-parser:

const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

结语

感谢您的阅读!如果您对 Express 中间件或者其他相关话题有任何疑问或见解,欢迎继续探讨。

相关文章:

Express 中间件

在构建 Web 应用程序时,中间件(Middleware)扮演着至关重要的角色。它允许你定义一系列的函数来处理 HTTP 请求和响应过程中的各种任务。Express.js 是 Node.js 上最流行的框架之一,以其简洁且强大的中间件机制著称。本文将深入探讨…...

ABB能源自动化选用宏集Cogent DataHub避免DCOM问题,实现高效、安全的数据传输

案例概况 ABB能源自动化公司通过宏集Cogent DataHub软件将电厂设施的数据实时传输到公司办公室,实现了OPC隧道/镜像解决方案,在电厂和公司网络之间建立了一个安全、可靠的连接,确保数据传输的高度安全,减少入侵风险。 &#xff0…...

springboot239-springboot在线医疗问答平台(源码+论文+PPT+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…...

【Elasticsearch】分析器的构成

在Elasticsearch中,分析器(Analyzer)是一个处理文本数据的管道,它将输入的文本转换为一系列词元(tokens),并可以对这些词元进行进一步的处理和规范化。分析器由以下三个主要组件构成&#xff1a…...

Python 调用 Azure OpenAI API

在人工智能和机器学习快速发展的今天,Azure OpenAI 服务为开发者提供了强大的工具来集成先进的 AI 能力到他们的应用中。本文将指导您如何使用 Python 调用 Azure OpenAI API,特别是使用 GPT-4 模型进行对话生成。 准备工作 在开始之前,请确保您已经: 拥有一个 Azure 账户…...

数据结构 算法时间复杂度和空间复杂度

一、算法好坏的度量 【事前分析法】 算法设计好后,根据算法的设计原理,只要问题规模确定,算法中基本语句执⾏次数和需求资源个数 基本也就确定了。 ⽐如求1 2 3 ... n − 1 n ,可以设计三种算法: 算法A&#xff…...

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 代码下载:CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景及意义 随着全球能源危机和环境问题的日益严重,可再…...

钉钉位置偏移解决,钉钉虚拟定位打卡

虚拟定位打卡工具 一,介绍免费获取工具 一,介绍 提到上班打卡,职场人的内心戏估计能拍成一部连续剧。打卡,这俩字仿佛自带“紧箍咒”,让无数打工人又爱又恨。想象一下,你气喘吁吁地冲进办公室,…...

【面试集锦】如何设计SSO方案?和OAuth有什么区别?

如何设计SSO方案?和OAuth有什么区别?--楼兰 带你聊最纯粹的Java ​ 如果面试问你,你会做一个权限系统吗?那你肯定会说做过。不就是各种登录、验证吗。我做的第一个CRUD应用就是注册、登录。简单!但是,如果问你在工作中真的做过权限系统吗?其实很多人都只能默默摇摇头。因…...

Python 基于 OpenCV 的人脸识别上课考勤系统(附源码,部署教程)

博主介绍:✌2013crazy、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&a…...

vcredist_x64.exe 是 Microsoft Visual C++ Redistributable 的 64 位版本

vcredist_x64.exe 是 Microsoft Visual C++ Redistributable 的 64 位版本,它提供了运行基于 Visual C++ 编写的应用程序所需的库文件。许多 Windows 应用程序都依赖这些库来正常运行,特别是使用 Visual Studio 编译的程序。 用途和重要性: 运行时库:vcredist_x64.exe 安装…...

Tailwind CSS 的核心理念

实用优先(Utility-First) Tailwind CSS 的最核心理念是"实用优先"。这种方法颠覆了传统的 CSS 开发方式,不再编写自定义的类名和样式规则,而是通过组合预定义的工具类来构建界面。这种方式带来了以下优势: …...

集成学习(二):从理论到实战(附代码)

接上一篇续写《集成学习(一):从理论到实战(附代码)》 五、实用算法 5.1 随机森林 随机森林在数据集的各个子样本上拟合许多决策树分类器,并使用平均来提高预测精度和控制过拟合。每一个分类器拟合了一部分随机样本,…...

HTML 链接

HTML 链接 引言 HTML(超文本标记语言)是构建网页的基础,而链接是网页中不可或缺的元素。链接不仅能够连接到其他网页,还能实现网页内部内容的跳转。本文将详细介绍HTML链接的用法、属性以及如何实现链接的优化。 HTML链接的基本…...

【机器学习】数据预处理之scikit-learn的Scaler与自定义Scaler类进行数据归一化

scikit-learn的Scaler数据归一化 一、摘要二、训练数据集和测试数据集的归一化处理原则三、scikit-learn中的Scalar类及示例四、自定义StandardScaler类进行数据归一化处理五、小结 一、摘要 本文主要介绍了scikit-learn中Scaler的使用方法,特别强调了数据归一化在…...

android的第一个app项目(java版)

一.学习java重要概念 java的基本类型的语言方法和C语言很像,这都是我们要学的东西和学过的东西。那些基础东西,就不和大家讨论了,一起看一下java的一些知识架构。 1.封装 封装是面向对象编程中的一个核心概念,它涉及到将数据和操…...

上位机知识篇---SSHSCP密钥与密钥对

文章目录 前言第一部分:SCP(Secure Copy Protocol)功能使用方法1.从本地复制到远程主机2.从远程主机复制到本地3.复制整个目录4.指定端口5.压缩传输 第二部分:SSH(Secure Shell)功能使用方法1.远程登录2.指…...

智慧物流新引擎:ARM架构工控机在自动化生产线中的应用

工业自动化程度的不断提升,对高性能、低功耗和高可靠性的计算设备需求日益增长。ARM架构工控机因其独特的优势,在多个工业领域得到了广泛应用。本文将深入探讨ARM架构工控机的特点及其在具体工业场景中的应用。 ARM架构工控机的主要优势 高效能与低功耗…...

[MySQL]2-MySQL索引

目录 1.索引🌟 1.1索引结构 B树 B树 聚簇索引(一级索引)与非聚簇索引(二级索引) 回表操作 1.2索引碎片 清理索引碎片的方法 1.3索引匹配方式🌟 在数据列上使用函数或者计算会导致索引失效的原因 …...

DeepSeek冲击下,奥特曼刚刚给出对AGI的「三个观察」,包括成本速降

来源 | 机器之心 今天凌晨,OpenAI CEO 再次发布长文,重申自己对于 AGI 的三个观察。 核心观点如下: 1. 人工智能模型的智能大致等于用于训练和运行该模型的资源的对数。 2. 使用一定水平的人工智能的成本每 12 个月就会下降约 10 倍&#x…...

贪心算法应用:埃及分数问题详解

贪心算法与埃及分数问题详解 埃及分数(Egyptian Fractions)问题是数论中的经典问题,要求将一个真分数表示为互不相同的单位分数之和。本文将用2万字全面解析贪心算法在埃及分数问题中的应用,涵盖数学原理、算法设计、Java实现、优…...

结构型设计模式之Proxy(代理)

结构型设计模式之Proxy(代理) 前言: 代理模式,aop环绕通知,动态代理,静态代理 都是代理的一种,这次主要是记录设计模式的代理demo案例,详情请看其他笔记。 1)意图 为其…...

历史记录隐藏的安全风险

引言 在数字化生活与工作场景中,历史记录功能广泛存在于浏览器、办公软件、移动应用等各类平台。它通过记录用户的搜索内容、操作痕迹、访问路径等信息,为用户提供便捷的操作体验和个性化服务。然而,这种看似便利的功能背后,却隐藏…...

Flask文件处理全攻略:安全上传下载与异常处理实战

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现: 2023 年开年,ChatGPT 作为一款聊天型AI工具,成为了超越疫情的热门词条;而在AI的另一个分支——绘图领域,一款名为Midjourney(MJ&#xff…...

ubuntu下libguestfs-tools

在ubuntu下,使用libguestfs-tools工具挂载其他磁盘和分区。 首先安装libguestfs-tools将vmx虚拟磁盘共享:sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other执行如下命令查看分区名称:virt-filesystems -a /mnt/hgfs/D/vmware/FGT_VM64-v7…...

MCP客户端Client开发流程

1. uv工具入门使用指南 1.1 uv入门介绍 MCP开发要求借助uv进行虚拟环境创建和依赖管理。 uv 是一个Python 依赖管理工具,类似于pip 和 conda ,但它更快、更高效,并且可以更好地管理 Python 虚拟环境和依赖项。它的核心目标是 替代 pip 、…...

经典算法回顾之最小生成树

最小生成树(Minimum Spanning Tree,简称MST)是图论中的一个重要概念,主要用于解决加权无向图中连接所有顶点且总权重最小的树结构问题。本文对两种经典的算法即Prim算法和Kruskal算法进行回顾,并对后者的正确性给出简单…...

Eigen实现非线性最小二乘拟合 + Gauss-Newton算法

下面是使用 Eigen 实现的 非线性最小二乘拟合 Gauss-Newton 算法 的完整示例,拟合模型为: 拟合目标模型: y exp ⁡ ( a x 2 b x c ) y \exp(a x^2 b x c) yexp(ax2bxc) 已知一组带噪声数据点 ( x i , y i ) (x_i, y_i) (xi​,yi​)&…...

mac 设置cursor (像PyCharm一样展示效果)

一、注册 Cursor - The AI Code Editor 二、配置Python环境 我之前使用pycharm创建的python项目,以及创建了虚拟环境,现在要使用cursor继续开发。 2.1 选择Python 虚拟环境 PyCharm 通常将虚拟环境存储在项目目录下的 venv 或 .venv 文件夹中&#xf…...