【express-generator】05-路由中间件和错误处理(第一阶段收尾)

news2025/1/9 1:35:00

一、前言

上篇文章我们介绍了express-generator的请求体解析,重点讲了常用的请求体数据格式(JSON/URL 编码的表单数据)以及一个FILE文件上传,同时搭配代码示范进行辅助理解。

二、本篇重点

我们继续第一阶段的知识,本篇把最后两个知识点(路由中间件和错误请求)讲完,顺利完成第一阶段的初步认识和学习。

三、知识点:路由中间件

1、路由中间件是什么?

路由中间件是 Express 中的一个强大功能,它允许你在处理请求之前和之后执行自定义逻辑。中间件可以用于各种任务,如日志记录、身份验证、数据验证等。 

 路由中间件可以被理解为一个函数,它接收三个参数:req(请求对象)、res(响应对象)和 next(函数)。这个函数可以对这三个参数进行操作,并且通过这些操作来影响 Express 服务器的行为。以下是路由中间件的一些关键点:

  1. 接收参数

    • req(请求对象):包含了请求的所有信息,如请求方法、URL、请求头、请求体等。中间件可以读取和修改 req 对象的属性。
    • res(响应对象):用于向客户端发送响应。中间件可以发送响应、设置响应头、设置响应状态码等。
    • next(函数):调用 next() 可以将控制权传递给下一个中间件或路由处理函数。如果不调用 next(),请求处理流程将停止。
  2. 操作和影响

    • 读取和修改请求信息:中间件可以读取请求中的数据,如解析请求体、获取请求头信息等。也可以修改请求对象,如添加自定义属性、修改请求参数等。
    • 发送响应:中间件可以直接向客户端发送响应,结束请求处理流程。例如,可以发送错误响应、重定向响应等。
    • 执行自定义逻辑:中间件可以执行各种自定义逻辑,如身份验证、日志记录、数据验证、缓存处理等。
    • 错误处理:中间件可以捕获和处理错误,将错误传递给错误处理中间件,或者直接发送错误响应。

 中间件的执行顺序

  • 顺序执行:中间件按照它们在 app.use() 中被调用的顺序执行。每个中间件都有机会处理请求,并决定是否将控制权传递给下一个中间件。
  • 调用 next():中间件通过调用 next() 函数来将控制权传递给下一个中间件。如果中间件不调用 next(),请求处理流程将停止,不会执行后续的中间件或路由处理函数。

2、express-generator创建express应用程序,默认使用的路由中间件

 首先让我们看看使用express-generator创建一个express应用程序时,app.js默认使用的路由中间件有哪些

知识点相关介绍: 

1. logger('dev')

  • 作用:使用 morgan 日志记录器中间件,记录 HTTP 请求的详细信息。
  • 配置'dev' 是 morgan 的预定义格式之一,它会在开发环境中提供简洁的彩色日志输出,包括请求方法、URL、响应状态码和响应时间等。
  • 使用场景:用于开发环境中的日志记录,帮助开发者监控和调试应用程序。

2. express.json()

  • 作用:解析 JSON 格式的请求体。
  • 使用场景:用于处理客户端发送的 JSON 数据,例如 API 请求中的 JSON 数据。

3. express.urlencoded({ extended: false })

  • 作用:解析 URL 编码的请求体。
  • 配置{ extended: false } 表示使用内置的查询字符串解析器,它只能解析简单的键值对,不支持嵌套对象或数组。
  • 使用场景:用于处理 HTML 表单提交的数据,这些数据通常以 application/x-www-form-urlencoded 格式发送。

4. cookieParser()

  • 作用:解析客户端发送的 Cookie。
  • 使用场景:用于处理客户端发送的 Cookie,以便在服务器端进行身份验证或其他需要 Cookie 的操作。

5. express.static(path.join(__dirname, 'public'))

  • 作用:提供静态文件服务。
  • 配置path.join(__dirname, 'public') 指定了静态文件的目录,通常是项目的 public 目录。
  • 使用场景:用于提供网站的静态资源,如图片、CSS、JavaScript 文件等,使得客户端可以直接访问这些文件。

 3、动手写一个简单的路由中间件

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

// 定义一个日志记录中间件
function logRequest(req, res, next) {
  const { method, url } = req;
  console.log(`Received ${method} request for ${url}`);
  next(); // 调用下一个中间件 
}

// 使用中间件
app.use(express.json())  //解析请求体数据
app.use(logRequest);     //日志记录中间件
app.get('/', (req, res) => {
  res.send('Hello, World!');
});
app.post('/user', (req, res) => {
    console.log("接收的请求体参数>>>",req.body);
    res.send(req.body);
  });
  
app.listen(3009, () => {
  console.log('Server is running on port 3009');
});

 启动服务器,打开apipost工具进行路由测试

 在这个示例中,logRequest 中间件会在每个请求到达时记录请求方法和 URL。

四、知识点:错误处理

错误处理是任何 Web 应用程序的重要组成部分。在 Express 中,错误处理中间件用于捕获和处理在请求处理过程中发生的错误。

常用知识点

  • 错误处理中间件:必须有四个参数:errreqres 和 next
  • 抛出错误:在中间件或路由处理函数中使用 next(err) 来传递错误。
  • 自定义错误对象:可以创建自定义错误对象以提供更详细的错误信息。

 1、常见的错误类型

  1. 语法错误:由于代码编写错误导致的错误,如拼写错误、语法不正确等。
  2. 运行时错误:在代码执行过程中发生的错误,如访问未定义的变量、调用不存在的方法等。
  3. HTTP 错误:与 HTTP 请求和响应相关的错误,如 404(未找到)、500(服务器内部错误)等。
  4. 输入验证错误:由于用户输入不符合预期格式或规则导致的错误。
  5. 数据库错误:与数据库操作相关的错误,如查询失败、连接错误等。

2、错误处理中间件

错误处理中间件是 Express 中用于处理错误的特殊中间件。它有四个参数:errreqresnext。当在中间件或路由处理函数中调用 next(err) 时,控制权会传递给错误处理中间件。

 一个简单的代码示范

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

// 模拟一个路由处理函数,可能会抛出错误
app.get('/error', (req, res, next) => {
  const error = new Error('Something went wrong!');
  error.status = 500; // 设置 HTTP 状态码
  next(error); // 将错误传递给错误处理中间件
});

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack); // 记录错误堆栈
  res.status(err.status || 500).json({
    error: {
      message: err.message
    }
  });
});

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

 启动服务器,在apipost工具中进行测试。

点击发送,得到结果

3、自定义错误对象

自定义错误对象可以帮助我们更清晰地表示特定类型的错误,并提供额外的上下文信息。

以下是一个自定义错误对象的简单代码示范。

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

// 自定义错误类
class CustomError extends Error {
  constructor(message, status) {
    super(message);
    this.status = status;
    this.name = 'CustomError';
  }
}

// 模拟路由 1:抛出自定义错误
app.get('/custom-error', (req, res, next) => {
  const error = new CustomError('Custom error occurred', 400);
  next(error);
});

// 模拟路由 2:抛出普通错误
app.get('/error', (req, res, next) => {
  const error = new Error('Something went wrong!');
  error.status = 500;
  next(error);
});

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(err.status || 500).json({
    error: {
      message: err.message,
      name: err.name
    }
  });
});

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

启动服务,打开apipost攻击进行测试

 


五、总结

至此,我们初步完成第一阶段的所有知识学习以及练习。多动手实践,举一反三,希望文章的案例会对大家有所帮助。

接下来的文章,我们接着第二阶段的知识学习以及代码案例练习。第二阶段的大纲如下:

第二阶段:进阶与应用

  1. RESTful API 设计

    • 学习如何设计符合 REST 原则的 API,包括资源的表示和 HTTP 方法的使用。

  2. 路由分组

    • 学习如何使用路由分组来组织相关的路由,提高代码的可维护性。

  3. 路由重定向

    • 学习如何使用 res.redirect() 和 res.location() 来实现路由重定向。

  4. CRUD 操作

    • 练习实现完整的 CRUD 操作的路由,包括与数据库的交互。 


如果你喜欢这篇文章,请点赞收藏。

关注我,获取前端更多使用知识。

最近业务需求多,会比较忙,但我也会抽出时间进行更新文章,敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python无需验证码免登录12306抢票 --selenium(2)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示:这里可以添加本文要记录的大概内容: 就在刚刚我抢的票:2025年1月8日…

深度学习驱动的蛋白质设计技术与实践

通过设计特定的蛋白质结构,可以实现预期的生物功能,如催化特定化学反应、识别和结合特定分子、调控生物信号传导等,为生物医学、药物研发、生物技术等领域提供重要工具和解决方案。传统的蛋白质设计方法主要依赖于已知蛋白质结构的同源建模、…

【动态重建】时间高斯分层的长体积视频

标题:Representing Long Volumetric Video with Temporal Gaussian Hierarchy 来源:浙江大学 链接:https://zju3dv.github.io/longvolcap/ 文章目录 摘要一、前言二、主要方法2.1 时间高斯分层2.2 高效渲染2.3 层次结构更新2.4 紧凑的外观模型…

【STM32+CubeMX】 新建一个工程(STM32F407)

相关文章: 【HAL库】 STM32CubeMX 教程 1 --- 下载、安装 目录 第一部分、新建工程 第二部分、工程文件解释 第三部分、编译验证工程 友情约定:本系列的前五篇,为了方便新手玩家熟悉CubeMX、Keil的使用,会详细地截图每一步Cu…

el-date-picker 不响应change事件的解决办法

前言 接到需要把element plus组件的日期时间选择器的input输入框展示隐藏,遇到点击确认按钮change事件不被触发问题,解决办法如下: ①visible-change的回调参考 即根据visible-change的方法里的回调参数进行需要操作 const visibleChange …

api开发如何在代码中使用京东商品详情接口的参数?

选择编程语言和相关工具 以 Python 为例,你可以使用requests库来发送 HTTP 请求获取接口数据。如果是 Java,可以使用OkHttp等库。 Python 示例 假设你已经安装了requests库,以下是一个简单的代码示例来获取和使用京东商品详情接口参数&#…

【docker系列】可视化Docker 管理工具——Portainer

1. 介绍 Portainer是一个可视化的Docker操作界面,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录…

机器学习基础-大语言模型

目录 大语言模型的基本概念 “大”体现在什么地方? 预训练微调两阶段的基本流程和作用 第一阶段:利用语言模型进行无监督预训练 第二阶段:通过监督微调的模式解决下游任务 BERT模型中MLM和NSP机制基本概念 MLM NSP Prompt学习的基本概…

Ubuntu挂载Windows 磁盘,双系统

首先我们需要在终端输入这个命令,来查看磁盘分配情况 lsblk -f 找到需要挂载的磁盘,检查其类型( 我的/dev/nvme2n1p1类型是ntfs,名字叫3500winData) 然后新建一个挂载磁盘的目录,我的是/media/zeqi/3500wi…

Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解

文章目录 模式介绍优缺点适用场景结构案例实现注意事项 模式介绍 有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此…

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能,选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其,在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换,特别方便。VS文件另…

AnaConda下载PyTorch慢的解决办法

使用Conda下载比较慢,改为pip下载 复制下载链接到迅雷下载 激活虚拟环境,安装whl,即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl

opencv摄像头标定程序实现

摄像头标定是计算机视觉中的一个重要步骤,用于确定摄像头的内参(如焦距、主点、畸变系数等)和外参(如旋转矩阵和平移向量)。OpenCV 提供了方便的工具来进行摄像头标定。下面分别给出 C 和 Python 的实现。 1. C 实现…

UE5AI感知组件

官方解释: AI感知系统为Pawn提供了一种从环境中接收数据的方式,例如噪音的来源、AI是否遭到破坏、或AI是否看到了什么。 AI感知组件(AIPerception Component)是用于实现游戏中的非玩家角色(NPC)对环境和其…

Python生日祝福烟花

1. 实现效果 2. 素材加载 2个图片和3个音频 shoot_image pygame.image.load(shoot(已去底).jpg) # 加载拼接的发射图像 flower_image pygame.image.load(flower.jpg) # 加载拼接的烟花图 烟花不好去底 # 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大 shoo…

智能手机租赁系统全新模式改变消费习惯与商家盈利路径

内容概要 智能手机租赁系统的崛起,让我们瞄到了一个消费市场的新风向标。想象一下,传统上人们总是为了最新款手机奋不顾身地排队、借钱甚至是透支信用卡。现在,通过灵活的租赁选项,消费者可以更加随意地体验高科技产品&#xff0…

【简博士统计学习方法】第1章:3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间(Hypothesis Space):所有可能的条件概率分布或决策函数,用 F \mathcal{F} F表示。 若定义为决策函数的集合: F { f ∣ Y f ( X ) } \mathcal{F…

牛客网刷题 ——C语言初阶(2分支和循环-for)——打印菱形

1. 题目描述 用C语言在屏幕上输出以下图案: 2. 思路 我是先上手,先把上半部分打印出来,然后慢慢再来分析,下面这是我先把整个上半部分打印出来,因为空格不方便看是几个,这里先用&代替空格了 然后这里…

STM32——系统滴答定时器(SysTick寄存器详解)

文章目录 1.SysTick简介2.工作原理3.SysTick寄存器4.代码延时逻辑5.附上整体代码6.一些重要解释 1.SysTick简介 Cortex-M处理器内集成了一个小型的名为SysTick(系统节拍)的定时器,它属于NVIC的一部分,且可以产生 SysTick异常(异常类型#15)。SysTick为简单的向下计数的24位计数…

《Opencv》信用卡信息识别项目

目录 一、项目介绍 二、数据材料介绍 1、模板图片(1张) 2、需要处理的信用卡图片(5张) 三、实现过程 1、导入需要用到的库 2、设置命令行参数 3、模板图像中数字的定位处理 4、信用卡图像处理 5、模板匹配 四、总结 一…