精华内容
下载资源
问答
  • 中间件是啥
    千次阅读
    2021-01-04 18:28:58

    中间件/Web中间件到底是什么

    中间件:
    顾名思义,中间件是提供系统软件和应用软件之间连接的软件,以便于软件和系统各部件之间的联系。中间件处于操作系统和更高一级应用程序之间(将应用程序运行环境与操作系统相互隔离)。

    操作系统 —— 中间件 —— 应用程序

    Web中间件:
    主要作用是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。
    中间件也叫做中间件服务器,也叫作应用服务器。

    正常情况下一次web的访问顺序是:
    web浏览器 —— WWW —— web容器 —— web应用服务器 —— 数据库服务器

    常见的Web中间件有哪些:
    weogic,Jboss,tomcat,webshere,IIS等

    有很多人在刚学的时候分不清web服务器,web中间件,web容器这三个,常常搞混。

    其实它们三个应该是包含的关系:
    web服务器 > web中间件 > web容器

    本章主要介绍的是中间件/web中间件,之后我会将中间件的常见漏洞以及,web服务器,web容器,web中间件做一个详细的内容。

    我也在安全的方向慢慢摸索,这些都当我自己的小笔记,欢迎大家指点批评。

    更多相关内容
  • 不会还有人不知道中间件吧?

    千次阅读 多人点赞 2020-10-13 10:25:02
    不会还有人不知道中间件吧?引言一. 中间件是什么?二. 中间件能干?2.1 中间件在应用开发中担任的角色三. 中间件特点四. 中间件的分类 引言 中间件(middleware)一词每天都被不同的人群所提及,中间件的产品也...

    常用中间件

    引言

    中间件(middleware)一词每天都被不同的人群所提及,中间件的产品也大量出现在软件市场,但中间件的定义却一直比较模糊,导致中间件的分类也不很统一。也许正因为如此,才使人们不断地设计和开发新的产品,并冠以中间件的标签,推动着中间件的内涵和市场不断地向前发展。

    相信大家看这篇文章的初心就是单纯想了解一下 中间件是啥?能干啥?我为什么要学它?公司中为啥要有做中间件的程序员?我平时学的dubbo等 属于中间件的什么类型?中间件有分类吗?这个答案在网络上一直没有一个准确的回答,这篇文章带你了解 中间件
    推荐一个Process on上的总结中间件很好的大佬

    一. 中间件是什么?

    应用中间件(Application Middleware),又名中间件,一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。

    中间件是为应用提供通用服务和功能的软件。数据管理、应用服务、消息传递、身份验证和 API 管理通常都要通过中间件。

    中间件可以帮助开发人员更有效地构建应用。它就如同是应用、数据与用户之间的纽带

    对于具有多云和容器化环境的企业而言,中间件可以助您大规模、经济高效地开发和运行应用

    二. 中间件能干啥?

    中间件的作用简单来说就是试图通过屏蔽各种复杂的技术细节使技术问题简单化。

      1. 中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。所以说中间件带给应用系统的,不只是开发的简便、开发周期的缩短,同时也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。
      1. 中间件作为新层次的基础软件,其重要作用是将不同时期、在不同操作系统上开发的应用软件集成起来,彼此像一个天衣无缝的整体协调工作,这是操作系统、数据库管理系统本身做不了的。

    2.1 中间件在应用开发中担任的角色

    经过精心设计,现代业务应用可以在本地或跨云端大规模运行。为了构建这些应用,开发人员需要一种具备统一基础功能的应用环境。中间件正是打造这种环境的关键。

    我们可以将这些功能分为四层,外加相应的工具:

    容器层

    中间件的这一层将以统一的方式管理应用生命周期的交付。它提供带有 CI/CD 的 DevOps 能力、容器管理功能以及服务网格功能。

    运行时层

    该层包含了自定义代码的执行环境。中间件可以为高度分布式云环境(例如微服务)、内存中缓存(用于快速访问数据)和消息传递(用于快速数据传输)提供轻量级运行时和框架。

    集成层

    集成中间件可提供相关服务,以通过消息传递、集成和 API 来连接自定义与购买的应用及 SaaS 资产,从而形成功能正常的系统。此外,它还可以提供内存数据库和数据缓存服务、数据/事件流以及 API 管理功能。

    流程自动化和决策管理层

    这是开发中间件的最后一层,旨在强化关键智能,实现优化和自动化,以及加强决策管理。

    工具

    除了上述四层中间件之外,还有相应的应用开发工具。它允许团队使用预设的模板和容器来构建应用,并促进了有效的代码共享和联合开发。这些工具可在本地和云端提供连贯一致的应用开发和交付体验。

    三. 中间件特点

    1. 应用支撑

    中间件的最终目的是解决上层应用系统的问题,而且也是软件技术发展到今天对应用软件提供最完善彻底的解决方案。现代面向服务的中间件在4个方面形成了很高地应用支撑能力,分别为软件的结构、模型、开发方法以及互操作,而要最终解决软件的灵活应变问题、效率问题、质量问题、互操作问题这四大问题,需要在软件技术的内在结构、架构层面进行思考。

    1. 耦合关系

    中间件基于SOA架构,在松耦和解耦过程中演变成了境界。而传统软件将软件之中核心三部分数据转换、网络连接和业务逻辑所有的都耦合在一个整体,产生为铁板一块的软件,然后动一点而动全身,这样的软件就很难适应市场的需求。而分布式对象技术可以分离连接逻辑,消息中间件异步处理连接逻辑,形成了很大的灵活性。中间件分离分布式对象与消息代理的数据转换。SOA架构以服务的封装,解耦实现了业务逻辑、数据转换与网络连接等。

    1. 互操作性

    传统中间件在软件的互操作方面,通过标准化的API完成了同类系统之间的调用互操作,但是连接互操作离不开原有的特定的访问协议,比如CORBA用于的IIOP,JAVA用于的RMI等。而SOA以支持Internet、标准化及操作系统无关的SOAP协议完成了连接互操作。并且服务的封装一般使用XML协议,它有自定义及自解析的特性,因此基于SOA的中间件能够完成语义互操作。

    1. 软件复用

    软件复用也称为软件的重用,是指在一定范围内不修改或者略有修改都属于重复使用。其实说白了其意思就是不断提升抽象级别,然后扩展复用的范围。最早使用的复用技术一般是子程序,自从发明子程序之后,人们就可以在不同系统之间进行软件复用。但子程序只是最原始的复用,因为这种复用范围只是在一个可执行程序内中的复用,静态开发期的复用,一旦子程序被修改,那么就需要重新对所有调用这个子程序的程序进行编译、测试以及发布。

    1. 平台化

    我们所说的平台是指能够独立运行并且自主存在的,能支撑上层系统和应用提供运行所依赖的环境。显然,不是所有的系统或者应用都可以称之为平台的。中间件是一个平台,因此中间件是必须独立存在,它在操作的系统软件,为上层的网络应用系统提供一个运行支撑环境,同时围绕标准的接口与API来隔离系统,完成其独立,也就是平台性。总的来说,中间件在完整业务复用、灵活业务组织方面的发展趋势集中体现在服务化,其核心技术是提升IT基础设施的业务敏捷性。中间件因此将成为SOA的主要实现平台。

    四. 中间件的分类

    从广义上讲,中间件涵盖了从 Web 服务器,到身份验证系统,再到消息传递工具等一切内容。以下是现代化开发中一些常见的中间件用例。
    红帽官网的这几张图完美解决了这个疑惑:

    F0D56454-48E1-4B45-9427-9F3184F9B51D.jpeg
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    看到这里应该就可以解决大家的大多数问题了,下面就是在百度百科上找的分类,我个人感觉写的大同小异!!!

    目前,针对不同的应用涌现出各具特色的中间件产品。从不同的角度和层次对中间件有不同的分类。根据中间件在系统中所起的作用和采用的技术不同,可以把中间件大致划分为以下几种:

    1. 数据访问中间件(Data Access Middieware)

    在分布式系统中,重要的数据都集中存放在数据服务器中,它们可以是关系型、复合文档型、具有各种存放格式的多媒体型,或者是经过加密或压缩存放的,数据访问中间件是在这种系统中建立数据应用资源互操作的模式,实现异构环境下的数据库联接或文件系统联接的中间件,从而为在网络上虚拟缓冲存取、格式转换、解压等带来方便。数据访问中间件在所有的中间件中是应用最广泛、技术最成熟的一种。一个最典型的例子就是ODBC,ODBC是一种基于数据库的中间件标准,它允许应用程序和本地或者异地的数据库进行通信,并提供了一系列的应用程序接口API,当然,在多数情况下这些API都是隐藏在开发工具中,不被程序员直接使用。不过在数据访问中间件处理模型中,数据库是信息存贮的核心单元,中间件完成通信的功能,这种方式虽然是灵活的,但是并不适合于一些要求高性能处理的场合,因为它需要大量的数据通信,而且当网络发生故障时,系统将不能正常工作。

    1. 远程过程调用中间件(RPC)

    远程过程调用是另外一种形式的中间件,它在客户/服务器计算方面,比数据库中间件又迈进了一步。通过这种远程过程调用机制,程序员编写客户方的应用,需要时可以调用位于远端服务器上的过程。它的工作方式如下:当一个应用程序A需要与远程的另一个应用程序B交换信息或要求B提供协助时,A在本地产生一个请求,通过通讯链路通知B接收信息或提供相应的服务,B完成相关处理后将信息或结果返回给A。RPC的灵活特性使得它有比数据库中间件更广泛的应用,它可以应用在更复杂的客户/服务器计算环境中。远程过程调用的灵活性还体现在它的跨平台性方面,它不仅可以调用远端的子程序,而且这种调用是可以跨不同操作系统平台的,而程序员在编程时并不需要考虑这些细节。RPC也有一些缺点,主要是因为RPC一般用于应用程序之间的通信,而且采用的是同步通信方式,因此对于比较小型的简单应用还是比较适合的,因为这些应用通常不要求异步通信方式。但是对于一些大型的应用,这种方式就不是很适合了,因为此时程序员需要考虑网络或者系统故障,处理并发操作、缓冲、流量控制以及进程同步等一系列复杂问题。

    1. 面向消息中间件(MOM)

    消息中间件能在不同平台之间通信,实现分布式系统中可靠的、高效的、实时的跨平台数据传输,它常被用来屏蔽掉各种平台及协议之间的特性,实现应用程序之间的协同;其优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发,这也是它比远程过程调用更进一步的原因。另外消息中间件不会占用大量的网络带宽,可以跟踪事务,并且通过将事务存储到磁盘上实现网络故障时系统的恢复。当然和远程过程调用相比,消息中间件不支持程序控制的传递。消息中间件适用于需要在多个进程之间进行可靠的数据传送的分布式环境。它是中间件中唯一不可缺少的,也是销售额最大的中间件产品,目前在Windows2000操作系统中已包含了其部分功能。

    1. 面向对象的中间件

    面向对象的中间件(Object Oriented Middieware)。当前开发大型应用软件通常采用基于组件技术,在分布系统中,还需要集成各节点上的不同系统平台上的组件或新老版本的组件;组件的含义通常指的是一组对象的集成,其种类有数百万种,但这些组件面临着缺乏标准而不能相互操作,各厂家的组件只能在各自的平台上运行。为此,连接这些组件环境的面向对象的中间件便应运而生。面向对象的中间件是对象技术和分布式计算发展的产物,它提供一种通讯机制,透明地在异构的分布计算环境中传递对象请求,而这些对象可以位于本地或者远程机器。在这些面向对象的中间件中,功能最强的是CORBA,可以跨任意平台,但是太庞大;JavaBeans较灵活简单,很适合于作浏览器,但运行效率差;DCOM模型主要适合Windows平台,已广泛使用。但是DCOM和CORBA这两种标准相互竞争,而且两者之间有很大的区别,这在一定程度上阻碍了面向对象中间件的标准化进程。当前国内新建系统实际上主要是UNIX(包括LINUX)和Windows,因此针对这两个平台建立标准的面向对象中间件是很有必要的。

    1. 事务处理中间件(TPM)

    事务处理中间件是在分布、异构环境下提供保证交易完整性和数据完整性的一种环境平台;它是针对复杂环境下分布式应用的速度和可靠性要求而实现的。它给程序员提供了一个事务处理的API,程序员可以使用这个程序接口编写高速而且可靠的分布式应用程序——基于事务处理的应用程序。事务处理中间件向用户提供一系列的服务,如应用管理、管理控制、已经应用于程序间的消息传递等。常见的功能包括全局事务协调、事务的分布式两段提交(准备阶段和完成阶段)、资源管理器支持、故障恢复、高可靠性、网络负载平衡等等。

    1. 网络中间件

    它包括网管、接入、网络测试、虚拟社区、虚拟缓冲等,也是当前研究的热点。
    终端仿真/屏幕转换中间件
    它的作用在于实现客户机图形用户接口与已有的字符接口方式的服务器应用程序之间的互操作。

    以上就是关于中间件的全部内容,欢迎大家关注我!!!

    展开全文
  • 这一节我们主要来学习一下什么是中间件,为什么使用中间件和主要中间件的分类。 中间件是什么 中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ ...
  • 什么是中间件

    万次阅读 多人点赞 2021-05-25 23:24:48
    一、百度百科 中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所...从这个意义上可以用一个等式来表示中间件中间件=平台+通信,这也就限定了只有用于分布式系统中才能叫中间件,同时也把它与支撑软件

    、什么是中间件?

    1、百度百科

    中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。目前,它并没有很严格的定义,但是普遍接受IDC的定义:中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。

    从这个意义上可以用一个等式来表示中间件:中间件=平台+通信,这也就限定了只有用于分布式系统中才能叫中间件,同时也把它与支撑软件和实用软件区分开来。

    简而言之,中间件是基于TCP/IP协议,遵循一定规范的。

    2、中间件的特性

    互通性、跨平台性、持久性、高可扩展性。

    背后遵循TCP/IP协议,但有时并不能满足业务场景的需求,因此要在TCP/IP协议的基础上构建自己的协议,比如AMQP协议,AMQP协议是rabbitMq的默认协议,包括在信息头中增加mark,消息内容标签、队列名、交换机名、ip、连接对象内存的一些信息。

    3、中间件的作用

    屏蔽操作系统的复杂性,屏蔽技术之间的局限性,使框架更加灵活。

    4、什么时候使用中间件

    选择中间件的时候,一定是业务的驱使,项目的驱动,一定要思考到底要不要使用,不要盲目的选择与跟从,如果使用不当,则会造成学习成本的浪费、人员结构的复杂化、维护和服务器成本的加剧。

    MySQL其实就是一个应用广泛的中间件。

    二、什么是协议

    1、所谓协议

    1. 计算机底层操作系统和应用程序通讯时共同遵守的一组规定,只有遵循共同的约定和规范,系统和底层操作系统之间才能相互交流。
    2. 和一般的网络应用程序的不同之处是,协议主要负责数据的接收和传递,所以性能比较高。
    3. 协议对数据格式和计算机之间交换数据都必须遵守规范。

    2、网络协议的三要素

    • 语义

    语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。

    • 语法

    语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。

    • 时序

    时序是对事件发生顺序的详细说明。

    3、为什么消息中间件不直接使用http协议?

    • 因为http请求报文头和响应报文头是比较复杂的,包含了cookie,数据的加密解密,状态码,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要,因为rabbitmq只是负责数据传递、存储、分发就够了,一定要追求高性能,尽量简洁、快速。
    • http大部分都是短连接,在实际的交互过程中,一个请求到响应很可能会被中断,中断以后也不会持久化,就会造成数据的丢失。这样就不适合在消息中间件中使用,因为消息中间件是一个长期的获取信息的过程,如果出现问题或故障,要进行持久化,目的是为了保证消息和数据的高可靠和高可用。

    4、AMQP协议

    AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

    特性:

    1. 支持分布式事务
    2. 支持消息的持久化
    3. 高性能和高可靠的消息处理

    三、消息队列持久化

    持久化,简单的说就是将数据存入磁盘,而不是存在内存中,不会因为服务器的重启而消失,使护具能够永久保存。

    rabbitmq是以文件存储的形式进行持久化的。

    四、消息的分发策略

    rabbitmq支持发布订阅、轮询分发、公平分发、重发、消息拉取。

    五、消息队列高可用和高可靠

    集群保证高可用;

    持久化保证高可靠;

     

    往期精彩内容:

    Java知识体系总结

    Spring框架总结

    超详细的springBoot学习笔记

    常见数据结构与算法整理总结

    Java设计模式:23种设计模式全面解析

    Java面试题总结(附答案)

    Linux知识体系总结

    Redis知识体系总结

    展开全文
  • Node.js---中间件

    千次阅读 多人点赞 2022-01-09 16:15:22
    中间件一、中间件概念1、Express 中间件的调用流程2、Express 中间件的格式3、next 函数的作用二、Express 中间件的使用1、定义中间件函数2、全局生效的中间件3、定义全局中间件的简化形式4、中间件的作用5、定义多...

    一、中间件概念

    中间件(Middleware ),特指业务流程的中间处理环节。

    1、Express 中间件的调用流程

            当一个请求到达 Express 的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。如下所示:
    在这里插入图片描述

    2、Express 中间件的格式

            Express 的中间件,本质上就是一个 function 处理函数,Express 中间件的格式如下:

    var express = require('express');
    var app = express();
    app.get('/',(res,req,next)=>{
    	next();
    	});
    app.listen(3000);
    

    注意:中间件函数的形参列表中,必须包含 next 参数。

    3、next 函数的作用

            next 函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由。
    在这里插入图片描述

    二、Express 中间件的使用

    1、定义中间件函数

    如下所示:

    const express = require('express');
    const app = express();
    //定义一个最简单的中间件函数
    const mw = (req,res,next)=>{
        console.log('这是最简单的中间件函数')
        //把流转关系,转交给下一个中间件或路由
        next();
    }
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    

    2、全局生效的中间件

            客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件。
            通过调用 app.use(中间件函数),即可定义一个全局生效的中间件,示例代码如下:

    const mw = function (req,res,next){
        console.log('这是最简单的中间件函数')
        //把流转关系,转交给下一个中间件或路由
        next()
    }
    //将mw注册为全局生效的中间件
    app.use(mw)
    

    如下:

    const express = require('express');
    const app = express();
    //定义一个最简单的中间件函数
    const mw = function (req,res,next){
        console.log('这是最简单的中间件函数')
        //把流转关系,转交给下一个中间件或路由
        next()
    }
    //将mw注册为全局生效的中间件
    app.use(mw)
    app.get('/',(req,res)=>{
        res.send('Home page.')
    })
    app.post('/',(res,req)=>{
        res.send('user page.')
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    

    先在终端运行:
    在这里插入图片描述
    打开postman,进行测试:
    get测试
    在这里插入图片描述
    发现终端输出:
    在这里插入图片描述
            这是因为当我们向服务器响应请求时,服务器会先将请求交中间件处理,当中间件处理完成后,会调用一次next()函数,将流转关系,转交给下一个中间件或路由。
            post测试方法上同,不在赘述。

    3、定义全局中间件的简化形式

    如下所示:

    app.use(function (req,res,next){
        console.log('这是最简单的中间件函数')
        //把流转关系,转交给下一个中间件或路由
        next()
    })
    

    进行测试,发现也可以成功调用。

    4、中间件的作用

            多个中间件之间,共享同一份 req 和 res。基于这样的特性,我们可以在上游的中间件中,统一为 reqres 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。
            例如:请求到达服务器之后,得到每个路由此次请求的时间。代码如下:

    const express = require('express')
    const app = express();
    app.use((req,res,next)=>{
        //获取到请求到服务器的时间
        const time = Date.now()
        //为req对象挂载自定义属性,从而把时间共享给后面所有的路由
        req.startTime = time;
        next();
    })
    app.get('/user1',(req,res)=>{
        res.send('Home page'+req.startTime)
    })
    app.get('/user2',(req,res)=>{
        res.send('User page'+req.startTime)
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    

    在终端运行:
    在这里插入图片描述然后打开postman,进行测试:
    在这里插入图片描述

    在这里插入图片描述
    测试成功。

    5、定义多个全局中间件

            可以使用 app.use() 连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行调用,示例代码如下:

    const express = require('express');
    const app = express();
    //定义第一个中间件
    app.use((req,res,next)=>{
        console.log('这是第一个中间件')
        next();
    })
    //定义第二个中间件
    app.use((req,res,next)=>{
        console.log('这是第二个中间件')
        next()
    })
    //定义路由
    app.get('/user',(req,res)=>{
        res.send('User page.')
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    

    在终端运行:
    在这里插入图片描述
    打开postman进行测试:
    在这里插入图片描述
    在打开终端,可以看到终端输出:
    在这里插入图片描述
    测试成功。

    6、局部生效的中间件

            不使用 app.use() 定义的中间件,叫做局部生效的中间件,示例代码如下:

    const express = require('express')
    const app = express();
    //定义中间件函数
    const mw1 = (req,res,next)=>{
        console.log('调用了局部生效的中间件')
        next()
    }
    //创建路由
    app.get('/',mw1,(req,res)=>{
        res.send('Home page')
    })
    app.get('/user',(req,res)=>{
        res.send('User page')
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    

    在终端运行:
    在这里插入图片描述
    打开postman进行测试:
    在这里插入图片描述在回到终端,发现输出:
    在这里插入图片描述
    再去postman调用第二个路由,如下:
    在这里插入图片描述
    终端并没有输出中间件函数的内容,说明该中间件是局部生效的。测试成功。

    7、定义多个局部中间件

    可以在路由中,通过如下两种等价的方式,使用多个局部中间件:

    //写法1
    app.get('/',mv1,mv2,(req,res)=>{res.send('Home page')}
    //写法2
    app.get('/',[mv1,mv2],(req,res)=>{res.send('Home page')}
    

    如下:

    const express = require('express');
    const app = express();
    //定义中间件函数
    const mv1 = (res,req,next)=>{
        console.log('调用了第一个局部生效的中间件')
        next()
    }
    const mv2 = (req,res,next)=>{
        console.log('调用了第二个局部生效的中间件')
        next()
    }
    //定义路由
    app.get('/',mv1,mv2,(req,res)=>{
        res.send('Home page')
    })
    app.get('/user',(req,res)=>{
        res.send('User page')
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    

    在终端启动服务器:
    在这里插入图片描述
    打开postman进行测试,先开启第一个路由:

    在这里插入图片描述
    在这里插入图片描述
    再开启第二个路由:
    在这里插入图片描述
            终端无其他输出,说明该中间件是局部生效的。测试成功。
    需要注意的是:

    • 一定要在路由之前注册中间件
    • 客户端发送过来的请求,可以连续调用多个中间件进行处理
    • 执行完中间件的业务代码之后,不要忘记调用 next() 函数
    • 为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码
    • 连续调用多个中间件时,多个中间件之间,共享 reqres 对象

    三、中间件的分类

    1、应用级别的中间件

            通过 app.use()app.get()app.post() ,绑定到 app 实例上的中间件,叫做应用级别的中间件,如下:

    //应用级别的中间件(全局中间件)
    app.use((res,,req,next)=>{
    	next()
    })
    //应用级别的中间件(局部中间件)
    app.get('/',mv1,(req,res)=>{
    	res.send('Home page')
    });
    

    2、路由级别的中间件

            绑定到 express.Router() 实例上的中间件,叫做路由级别的中间件。它的用法和应用级别中间件没有任何区别。只不过,应用级别中间件是绑定到 app 实例上,路由级别中间件绑定到 router 实例上,代码示例如下:

    const app = express();
    var router = express.Router();
    //路由级别的中间件
    router.use((req,res,next)=>{
    	next();
    }
    app.use('/',router)
    

    3、错误级别的中间件

            错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题。
    格式:错误级别中间件的 function 处理函数中,必须有 4 个形参,形参顺序从前到后,分别是 (err, req, res, next)
            创建一个基本的服务器,定义一个路由,指定路由的处理函数,在处理函数内部定义一个人为的错误,如下:

    const express = require('express');
    const app = express();
    //定义路由
    app.get('/',(req,res)=>{
        //人为的制造错误
        throw new Error('服务器内部发生了错误')
        res.send('Home page')
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    

    进行代码验证:
    先在终端打开服务器:
    在这里插入图片描述
    接着去postman里面进行测试:
    在这里插入图片描述
    在这里插入图片描述

            发现服务器内部发生错误,现在在定义一个错误级别的中间件,捕获整个项目中发生的异常错误,如下:

    //定义错误级别的中间件,捕获整个项目的异常情况,防止程序崩溃
    app.use(function(err,req,res,next){
        console.log('发生了错误'+err.message)
        res.send('Error:'+err.message)
    })
    

    在终端启动服务器,然后在postman中进行测试:
    在这里插入图片描述
    测试成功,但是需要注意的是:
    错误级别的中间件,必须注册在所有路由之后!

    4、Express内置的中间件

            自 Express 4.16.0 版本开始,Express 内置了几 个常用的中间件,极大的提高了 Express 项目的开发效率和体验:

    • express.json 解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)
    • express.urlencoded 解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)

    语法:

    //配置解析application/json格式数据的内置中间件
    app.use(express.json))
    //配置解析application/x-www-form-urlencoded格式数据的内置中间件
    app.use(express,urlencoded({extended:false}))
    

            现在就对express.jsonexpress.urlencoded这两个中间件进行测试:

    1、 express.json

    先创建一个基本的服务器如下:

    const express = require('express');
    const app = express();
    app.post('/',(req,res)=>{
        res.send('ok')
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    
    

    在终端开启该服务器:
    在这里插入图片描述
    打开postman进行测试:
    在这里插入图片描述
            可以发起请求,并且可以响应结果,在通过postman向通过body向请求体发送一个JSON格式的数据,看服务器是否可以拿到,如下:
    在这里插入图片描述
    点击send发送请求:
    在这里插入图片描述
            得到响应。那么发送到服务器中的数据,服务器该如何接收呢?我们可以在服务器通过req.body这个属性来接收客户端发送的请求体数据,如下:

    app.post('/',(req,res)=>{
       console.log(req.body)
        res.send('ok')
    })
    

            再次启动服务器,并通过postman向通过body向请求体发送一个JSON格式的数据:
    在这里插入图片描述
            发送完成后发现服务器响应了一个undefined
            这是因为默认情况下,不配置表单数据的中间件,则req.body默认为undefined
    所以我们应该配置为:

    const express = require('express');
    const app = express();
    app.use(express.json())
    app.post('/',(req,res)=>{
       console.log(req.body)
        res.send('ok')
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    
    

    启动服务器,并通过postman向通过body向请求体发送一个JSON格式的数据,则:
    在这里插入图片描述
    服务器接收成功。

    2、express.urlencoded

    创建一个基本的服务器,在终端运行后,打开postman,如下:

    const express = require('express')
    const app = express();
    app.post('/book',(req,res)=>{
        res.send('ok')
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    

    在终端开启服务器,在去postman中进行测试:
    在这里插入图片描述

    可以发起请求,并且可以响应结果。
            先通过req.body这个属性来接收客户端发送的请求体数据,并添加 解析 URL-encoded 格式的中间件:

    app.use(express.urlencoded({extended:false}))
    app.post('/book',(req,res)=>{
        console.log(req.body)
        res.send('ok')
    })
    

            再通过postman通过body向请求体发送一个x-www-form-urlencoded格式的数据(键值对的形式),看服务器是否可以拿到,如下:
    在这里插入图片描述
    点击send:
    在这里插入图片描述
    服务器接收成功。

    5、第三方的中间件

            非 Express 官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件。在项目中,可以按需下载并配置第三方中间件,从而提高项目的开发效率。
            以 body-parser 这个第三方中间件为例。使用步骤如下:
    (1)运行 npm install body-parser 安装中间件
    在这里插入图片描述
    (2)使用 require 导入中间件

    //导入解析表单数据的中间件
    const parser = require('body-parser')
    

    (3)调用 app.use() 注册并使用中间件

    //使用app.use注册中间件
    app.use(parser.urlencoded({extended:false}))
    

    完整代码为:

    const express = require('express')
    const app= express();
    //导入解析表单数据的中间件
    const parser = require('body-parser')
    //使用app.use注册中间件
    app.use(parser.urlencoded({extended:false}))
    app.post('/',(req,res)=>{
    	console.log(res.body)
        res.send('xl')
    })
    app.listen(80,()=>{
        console.log('http://127.0.0.1')
    })
    

    在终端运行服务器后:
    在这里插入图片描述

            打开postman,通过body向请求体发送一个x-www-form-urlencoded格式的数据(键值对的形式),看服务器是否可以拿到,如下:
    在这里插入图片描述
    服务器显示为:
    在这里插入图片描述
    服务器显示成功。

    展开全文
  • 国产中间件-中创中间件相关手册
  • 什么是消息中间件?消息中间件可以做什么?

    万次阅读 多人点赞 2019-09-03 12:15:35
    什么是消息中间件 消息中间件:是利用高效可靠的消息传递机制进行异步的数据传输,并基于数据通信进行分布式系统的集成。通过提供消息队列模型和消息传递机制,可以在分布式环境下扩展进程间的通信。 消息...
  • 最全宝兰德中间件部署手册
  • 1、中间件是什么? 中间件(英语:Middleware)顾名思义是系统软件和用户应用软件之间连接的软件,以便于软件各部件之间的沟通,特别是应用软件对于系统软件的集中的逻辑,是一种独立的系统软件或服务程序,分布式...
  • 易语言PHP+mysql中间件

    2020-07-18 10:23:55
    易语言PHP+mysql中间件源码,PHP+mysql中间件,SQL_执行语句,SQL_取记录数,SQL_添加数据,SQL_修改数据,SQL_删除数据,SQL_查询数据,GET_CLIENT_RAND,GET_SERVER_RAND,HTTP_数据解密,HTTP_数据加密,RANDS,时间到时间戳,...
  • 工商银行中间件,直接部署到IIS即可使用
  • 一、什么是Django中间件  Django 中间件是用来处理Django的请求request和响应response的框架级别的钩子,它是一个轻量,低级别的插件系统,用于全局范围内改变Django的输入,输出。每个中间件组件都负责做一些特定...
  • web中间件常见漏洞总结.pdf
  • 中间件漏洞详解

    2021-06-11 04:03:53
    本课程分别从iis5.x/6、iis7、apache三个中间件漏洞进行分析,首先从原理上介绍形成该漏洞的原因,而后通过实战的形式演示怎么利用这三种漏洞对服务器进行攻击。
  • 程序结合易语言数据操作支持库,调用API函数通过PHP操作mysql。@易语言数据库教程。
  • Web中间件常见漏洞总结
  • 阿里中台中间件.mm

    2020-11-09 13:05:33
    阿里中间件思维导图
  • ICE中间件技术的详细教程,包含ice的开发基础,服务协议等,是初学ICE常用的工具书
  • .Net Core核心概念——中间件

    千次阅读 2020-05-19 09:58:22
    什么是中间件: 一个web应用程序都是把http请求封装成一个管道,一般来说每一次请求都要先经过管道的一系列操作,最终才到达我们的主程序中。中间件就是应用程序管道中的一个组件,用来拦截请求或进行一些其他处理...
  • Spring中间件 - 什么是中间件

    千次阅读 2021-11-19 18:26:29
    一、前言 在互联网应用开发初期,所有用于支撑系统建设的,框架结构、基础工具、业务逻辑、功能服务包括页面展示等,都是在一个系统中开发完成,最终也只是把系统和数据库部署在...在中间件这一层的建设,基本是来自.
  • 金蝶中间件Apusic Eclipse/MyEclipse all-plugins,用于集成在eclipse做调试开发
  • 中间件与装饰器

    2020-12-22 01:38:38
    Django自定义中间件 首先在settings.py文件中的MIDDLEWARE导入自定义的中间件类名 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', '...
  • Nodejs自定义解析表单数据的中间件案例
  • 主要介绍了Django 登陆验证码和中间件的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 常见的中间件以及什么是中间件

    千次阅读 2021-11-19 12:43:32
    常见的中间件以及什么是中间件1. 中间件是什么2. 为什么要用中间件3. 中间件的使用场景4. 主要的中间件的分类 1. 中间件是什么 中间件顾名思义就是系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通,...
  • 而文件上传(multipart/form-data请求),可以基于请求流处理,也可以使用formidable模块或Multer中间件。 1. multer中间件 Multer是Express官方推出的,用于Node.jsmultipart/form-data请求数据处理的中间件。 它...
  • 本文实例讲述了Laravel的中间件实现原理。分享给大家供大家参考,具体如下: #1 什么是中间件? 对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才可以让它继续传递到更深层次...
  • Azure功能中间件助手 这是一个用于为Azure Function HTTP处理程序实现中间件模式的简单模块,类似于Express.js已有的模块。 尽管已经有一些与该模块相似的模块,但是创建该模块也是一个简单的练习,我为了更好地理解...
  • Delphi强悍的极简中间件(服务端和客户端)_源码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 432,841
精华内容 173,136
关键字:

中间件是啥