nodejs 中间件

news/2024/5/9 4:56:11

一、是什么

Node.js 中的中间件,特别是针对 Web 开发框架(如 Express、Koa、Hapi 等)的中间件,其核心功能是用来对 HTTP 请求生命周期进行拦截、处理和传递的。
 

中间件这一概念是 Web 开发框架为了实现请求处理流程的模块化、可扩展性和复用性而引入的一种设计模式。
 

这些中间件可以执行各种任务,如:身份验证、日志记录、错误处理、参数解析、路由分发、CORS 设置、静态文件服务 等。

 

二、基本工作原理:

  1. 拦截:当一个 HTTP 请求到达服务器时,框架会将其传递给一个或多个中间件函数进行处理。这些中间件按照预先定义的顺序依次执行。

  2. 处理:每个中间件函数通常接收三个参数:请求对象(req)、响应对象(res)和一个用于将控制权传递给下一个中间件的回调函数(next)。中间件可以访问和操作这些对象,执行与请求相关的各种任务,如:

    • 解析请求数据:解析请求头、查询参数、请求体(如 JSON、表单数据等)。
    • 身份验证和授权:验证请求中的凭证,判断用户是否有权限访问特定资源。
    • 路由分发:根据请求路径和方法将请求转发到相应的处理函数。
    • 日志记录:记录请求和响应的相关信息,便于监控和调试。
    • 错误处理:捕获并处理在请求处理过程中发生的异常。
    • 内容协商和响应格式化:确定合适的响应格式(如 JSON、HTML),并格式化响应数据。
    • 跨域支持:设置响应头以允许跨域请求。
    • 性能优化:压缩响应内容、启用缓存策略等。
    • 其他业务逻辑:如数据预处理、统计分析、A/B 测试等。
  3. 传递:每个中间件在完成其特定任务后,可以选择调用 next() 函数将控制权传递给下一个中间件。如果中间件已经完成了请求的处理(如发送了响应),则不需要调用 next(),此时请求生命周期终止。

综上所述,Node.js 中的所有中间件确实都是用来对 HTTP 请求生命周期进行拦截、处理和传递的,它们构成了请求处理流水线,共同协作以提供完整的 Web 服务功能。这些中间件可以是框架内置的、第三方库提供的,或是开发者自定义编写的,其目的都是为了高效、灵活地应对各种 HTTP 请求场景。

三、常见的中间件:

  1. Authentication:

    • JWT (JSON Web Tokens)jsonwebtoken 库,用于生成、验证 JWT,实现无状态认证。
    • OAuthoauth2-server 或 oauth2orize,实现 OAuth 2.0 授权流程。
    • Passport: 通用的身份验证中间件,支持多种策略(如本地、社交登录等)。
  2. Logging:

    • morgan(适用于 Express): 生成 HTTP 请求日志。
    • koa-logger(适用于 Koa): 提供请求日志输出。
    • winston 或 pino: 更通用的日志记录库,可用于任何 Node.js 应用。
  3. Error Handling:

    • Express: 可以使用 app.use() 配置全局错误处理器。
    • Koa: 内置的 ctx.throw() 方法及 try...catch 结构,配合中间件进行错误处理。
  4. 请求/响应处理

    • Body Parsing
      • Expressexpress.json()express.urlencoded()
      • Koakoa-bodyparserkoa-body
      • 这些中间件用于解析客户端发送的请求体(JSON、URL-encoded 表单数据等)。
  5. 路由分发

    • Express: 内置的 app.get()app.post() 等路由定义方法。
    • Koa: 第三方库如 koa-router 提供更灵活的路由管理功能。
  6. 静态文件服务

    • Express: 内置的 express.static()
    • Koa: 第三方库如 koa-static,用于托管和提供静态资源(如 HTML、CSS、JavaScript、图片等)。
  7. 跨域资源共享 (CORS)

    • Expresscors 库。
    • Koakcors 或 koa-cors 库。
    • 这些中间件负责设置响应头以允许跨域请求,符合 CORS 协议。
  8. Session Management

    • Expressexpress-session
    • Koakoa-session
    • 提供会话管理功能,如创建、存储和销毁用户会话,支持基于 cookie 的身份验证。
  9. Compression:

    • compression: 适用于 Express,对响应内容进行 gzip 或 deflate 压缩,减少网络传输量。
  10. Caching:

    • Expressexpress-cache-response 或 express-superagent-cache 等库,实现响应缓存。
    • Koa: 可以使用第三方中间件如 koa-cache 实现缓存机制。

以上列举了一些常见的 Node.js 中间件类型及其对应的库。实际应用中,根据项目需求可能会选用更多特定功能的中间件,如速率限制、API 版本控制、请求验证(如校验 JSON Schema)、数据库连接管理、模板引擎支持等。


http://www.mrgr.cn/p/63010663

相关文章

python基础——正则表达式

📝前言: 这篇文章主要想讲解一下python中的正则表达式: 1,什么是正则表达式 2,re模块三匹配 3,元字符匹配 4,具体示例 🎬个人简介:努力学习ing 📋个人专栏&am…

TreeSet 和 TreeMap 和 HashSet 和 HashMap

一、二叉搜索树 1、概念 (1)二叉搜索树 要么是一棵空树,要么就得满足左子树上所有结点的值都小于根结点的值,右子树上所有结点的值都大于根结点的值,即左边比我小,右边比我大。二叉树的左右子树也分别都是…

IntelliJ IDEA2020下使用Maven构建Scala 项目

1.创建maven文件 2.进入pom.xml导入依赖 <!--添加spark的依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.2.1</version></dependency><!--添加scala依…

玩转nginx的配置文件3

1. limit_req_zone配置限流 limit_req_zone $binary_remote_addr zonemylimit:10m rate10r/s;upstream myweb {server 10.0.105.196:80 weight1 max_fails1 fail_timeout1;}server {listen 80;server_name localhost;location /login {limit_req zonemylimit;proxy_pass http:…

.net8系列-04图文并茂手把手教你配置Swagger支持token以及实现Swagger扩展,Swagger代码单独抽离

前情提要 接上篇文章,我们当前已完成如下内容:创建应用成功 创建接口成功 配置Swagger实现接口注释和版本控制 本文章主要内容为: 配置Swagger支持token传值测试接口快速上手-代码配置 添加如下代码 文件目录:\xiaojinWebApplication\xiaojinWebApplication\Program.cs// S…

【OceanBase诊断调优】——hpet(高精度时钟源)引起的CPU高问题排查

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题出来&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 昨天在问答区帮忙排查一个用户CPU高的问题&#xff0c;帖子链接&#xff1a;《刚刚新安装的OceanBase集群&#xff0c;…

万业企业发布23年年报、24年一季报,集成电路业务同比大增近七成 转型成效显著

4月26日晚间&#xff0c;万业企业&#xff08;600641&#xff09;发布2023年年度报告及2024年一季度报告。2023年&#xff0c;公司实现营业收入9.65亿元&#xff0c;归母净利润1.51亿元。其中&#xff0c;公司集成电路设备制造业务收入较上年同期大幅增长67.53%&#xff0c;公司…

Synchronized关键字的深入分析

一、引言 在多线程编程中&#xff0c;正确地管理并发是确保程序正确运行的关键。Java提供了多种同步工具&#xff0c;其中synchronized关键字是最基本且最常用的同步机制之一。本文旨在深入解析synchronized的实现原理&#xff0c;探讨其在不同应用场景中的使用&#xff0c;并…

.net报错异常及常用功能处理总结(持续更新)

@目录1. WebApi dynamic传参解析结果中ValueKind = Object处理方法问题描述方案1:(推荐,改动很小)方案2:2.C# .net多层循环嵌套结构数据对象如何写对象动态属性赋值问题描述JavaScript动态属性赋值.net动态属性赋值3.Object.GetType().GetProperty().GetValue()读取对象报错…

微信小程序实战项目开发(天气预报项目实战):内涵开发说明文档、需求文档 手把手分步骤教你写出自己的小程序项目 天气预报小程序 时实请求获取天气 自定义功能 完整的源代码

文章目录 微信小程序开发实现天气预报 一、项目需求分析需求分析实现思路分析详解如下&#xff1a;1、创建项目、全局配置 json 文件2、在 wxml文件中完成布局3、wxss的实现美化效果颜色渐变效果&#xff1a;鼠标 hover 浮动阴影效果&#xff1a;圆角效果底部按钮button使用fle…

Blender点操作

顶点操作即一般的“布线”操作 1.顶点移动 -先切到顶点模式 -移动&#xff0c;G 或 G X/Y/Z -旋转&#xff0c;R 同上 -缩放&#xff0c;S 同上 2.顶点滑移&#xff0c;用于微调顶点的位置 快捷键&#xff1a;Shift V&#xff0c;G G 3.顶点删除 -选中一个顶点 -按…

单机三pxc节点集群,+docker-haproxy2.0负载均衡实现

一.下载 https://www.haproxy.org/download/2.0/src/haproxy-2.0.5.tar.gz 或者在这里下载&#xff08;下面需要的各个配置文件都有&#xff09;&#xff1a; https://download.csdn.net/download/cyw8998/89170129 二.编写文件&#xff0c;制作docker镜像 1.Dockerfile&a…

SpringBoot源码阅读2-自动配置

SpringBoot源码阅读2-自动配置 在传统的Spring应用中&#xff0c;开发者需要手动配置一系列Web应用的核心组件&#xff0c;例如DispatcherServlet用于处理请求分发、ViewResolver用于视图解析、CharacterEncodingFilter用于字符编码过滤等。 然而在SpringBoot中只要引入了spr…

Mudem,打造私密安全、高效稳定的私人空间

Mudem 是 Codigger 平台中的一个关键组件&#xff0c;它提供基础通讯服务&#xff0c;确保不同类型的机器之间可以进行安全和高效的连接。它其设计理念在于将本地机器、公有云以及私有云上的设备无缝地整合为一个可远程在线访问的工作站&#xff08;Workstation&#xff09;。这…

Flutter 上架如何解决 ITMS-91053 问题

最近&#xff0c;我的 Flutter App 发布到 TestFlight 后&#xff0c;就会收到一封邮件&#xff1a;The uploaded build for YOUR APP has one or more issues. 上面的邮件主要是说&#xff0c;我的 App 缺少了调用 API 的声明&#xff0c;以前从来没看到过&#xff0c;上网一查…

百度昆仑、华为NPU

百度昆仑、华为NPU 为智能计算而生的昆仑芯XPU架构 昆仑芯科技团队于2017年在Hot Chips上发布自研的、面向通用AI计的芯片核心架构——昆仑芯XPU。 集十余年AI加速研发实践,昆仑芯XPU从AI落地的实际需求出发,按照复杂前沿的人工智能场景需求开展迭代, 致力为开发者提供通用、…

低代码技术与仓储管理的新纪元:革命性的供应链变革

引言 在当今数字化时代&#xff0c;企业对于创新和效率的追求越发迫切。在这样的背景下&#xff0c;低代码技术应运而生&#xff0c;成为企业数字化转型的重要工具之一。低代码技术的崛起为企业提供了一种快速、灵活、成本效益高的开发方式&#xff0c;大大缩短了软件开发周期…

【Leetcode】vector刷题

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;Leetcode刷题 目录 1.只出现一次的数字2.杨辉三角3.删除有序数组中的重复项4.只出现一次的数字II5.只出现一次的数字III6.电话号码的字母组合 1.只出现一次的数字 题目链接&#xff1a;136.只出现一…

使用 NVM 动态切node版本

一、安装nvm 官网链接&#xff1a; Release 1.1.9 coreybutler/nvm-windows GitHub 无脑安装直接下一步 安装完之后验证一下&#xff1a; #打开命令行输入命令 nvm 这样就是安装好了&#xff0c;然后我们开始安装node。 二、使用nvm安装node 1、去node官网获取版本号 …

【Linux】帮助类命令

在Linux中&#xff0c;man用于查看系统手册页&#xff08;manual pages&#xff09;。它用于查阅关于特定命令、函数、工具或文件格式的详细信息。要使用man命令&#xff0c;只需在终端中输入man&#xff0c;后跟您要查看的命令或主题的名称。 例如&#xff0c;如果查看ls命令…