30天精通Nodejs--第十八天:express-中间件

news/2024/7/19 15:34:09 标签: express, 中间件, nodejs, 后端, js, middleware

目录

引言

Express中间件作为其核心特性之一,为请求处理流程提供了极大的灵活性和可扩展性。本文将详细解读Express中间件的工作原理、使用方式以及实际应用中的高级技巧。

什么是Express中间件

Express中间件本质上是JavaScript函数,它们位于客户端发起的HTTP请求与服务器生成响应之间,形成一个有序的执行链。
每个中间件都有机会对请求进行预处理、修改或终结请求-响应周期。

js">function middleware(req, res, next) {
  // 对req(请求对象)、res(响应对象)进行操作
  // 调用next()以传递控制权给下一个中间件
}

// 绑定到Express应用
app.use(middleware);

其中req代表HTTP请求,包含了所有与请求相关的属性;res则用于构建HTTP响应;而next是一个回调函数,调用它会将控制权转移给后续的中间件

中间件的执行流程

当一个请求到达Express服务器时,它会按照绑定顺序依次通过各个中间件。如果中间件执行了res.send()、res.json()、res.end()等方法结束响应,则该请求生命周期终止,不再继续传递到后面的中间件。若没有结束响应,则必须调用next()方法,否则请求会被挂起。
例如,下面是一组按序执行的中间件

js">app.use((req, res, next) => {
  console.log('Middleware 1');
  next();
});

app.use((req, res, next) => {
  console.log('Middleware 2');
  res.send('Hello from Middleware 2'); // 这里会结束响应
});

app.use((req, res, next) => {
  console.log('Middleware 3'); // 如果请求未在Middleware 2中结束,这句会执行
});

中间件的分类

  1. 应用程序级中间件:直接绑定到app实例上的中间件,对所有路由都生效。
js">app.use(middlewareFunction);
  1. 路由级中间件:绑定到特定路由路径的中间件,只针对匹配该路径的请求生效。
js">app.get('/users', middlewareFunction, (req, res) => {
});
  1. 错误处理中间件:具有四个参数(err, req, res, next),专门用来捕获并处理在整个请求-响应生命周期中产生的错误。
js">app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('服务器异常!');
});

常用中间件

  1. 处理请求的body数据
    会把请求的body转换为json对象
js">app.use(express.json())
  1. 异常处理
    上面已经提到了,当服务器发生异常时会用到
js">app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('服务器异常!');
});
  1. 子路由中间件
    上篇文章中用到的子路由中间件
js">app.use('/api', router)

结语

Express中间件机制是其强大功能的核心所在,它允许开发者采用洋葱模型处理HTTP请求,使得业务逻辑能够解耦和复用,大大提高了开发效率和应用维护性。理解和掌握中间件的使用,对于构建高质量且易于扩展的Node.js Web服务至关重要。

Express 模块的更多用法可以查阅官方文档。

切记:多写代码。
在接下来的文章中,我们将继续深入探讨Node.js的各个方面。
大家有任何问题都可以在评论区留言交流,相互学习!


http://www.niftyadmin.cn/n/5321551.html

相关文章

C++ 拾遗 2

1.变量的作用域 1)全局变量 在整个程序生命周期内都是有效的,在定义位置之后的任意函数中都能访问。 全局变量在主程序退出时由系统收回内存空间。 2)局部变量 在函数或语句块内部的语句使用,在函数或语句块外部是不可用的。 …

高级分布式系统-第7讲 分布式系统的时钟同步

顺序的分类 在分布式系统中, 顺序关系主要分为以下三类:时间顺序: 事件在时间轴上发生的先后关系。 无限时刻集组成有向时间轴, 时间顺序是通过时刻的顺序体现的。 因果顺序: 如果事件e1是事件e2发生的原因&#xf…

FineBI实战项目一(21):不同支付方式订单总额分析开发

点击新建组件,创建不同支付方式订单总额组件。 选择饼图,拖拽total_money到角度,拖拽pay_type到颜色,调节内径。 修改颜色的标识文字。 将组件拖拽到仪表板。 结果如下:

聊天机器人之接入智能回复(四)

智能回复实现思路 目前市场上有许多大语言模型,他能帮助我们更好的解决问题或者陪伴我们聊天。最先兴起的就是OpenAI的ChatGPT,但是我们国内使用不太方便。所以这里我使用咱们国内的平台做一个简单展示。 首先这里咱们使用的是讯飞星火认知大模型&…

JAVAEE——内置对象和属性范围(二)

1. 内置对象和属性范围 1.1 知识点 (1)四种属性范围 (2)九个内置对象 1.2 具体内容 在我们之前的操作当中,经常使用到request.getParameter()来接受上一个页面传递过来的参数,那么在java当中&#xff0…

CSS 下载进度条

<template><view class=btn>下载中</view></template><script></script><style>/* 设置整个页面的样式 */body {width: 100vw; /* 页面宽度为视口宽度 */background: #000000; /* 背景颜色为白色 */display: flex; /* 使用 flex…

数据分析概述2(详细介绍机器学习

目录 1.名词解释&#xff1a;1.1算法和模型1.2参数和超参数 2.基础算法&#xff1a;3.高级算法&#xff1a;4.数据准备5.常用python包小结&#xff1a; 1.名词解释&#xff1a; 1.1算法和模型 算法&#xff1a;用于训练模型的方法&#xff0c;分为有监督学习、无监督学习、半…

Spring Data JPA 使用总结

本文记录了Spring data JPA 的一些细碎的规则。 findBy语法规则 :findOOXXByName 实际上等价 > findByName 比如: User findFirstByOrderByLastnameAsc();User findTopByOrderByAgeDesc();Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);…