web学习-Node.js入门学习

news2024/11/14 5:39:45

web学习-Node.js入门学习

  • 1.回顾与思考
  • 2. 初识Node.js
    • 2.1 Node.js的简介
    • 2.2Node.js的环境安装
    • 2.3. fs文件系统模块
      • 2.3.1 fs.readFile()
      • 2.3.2 fs.writeFile()
      • 2.3.3 练习-整理考试成绩
      • 2.3.4 fs模块-路径动态拼接的问题
    • 2.4 path路径模块
    • 2.5 http模块
      • 2.5.1 服务器相关的概念
      • 2.5.2 创建最基本的web服务器
      • 2.5.3 根据不同的url响应不同的html内容
  • 3. 模块化
    • 3.1 模块化的基本概念
    • 3.2 Node.js中模块的分类
      • 3.2.1 加载模块
      • 3.2.2 模块作用域
      • 3.2.3 向外共享模块作用域中的成员
    • 3.3 npm与包
      • 3.3.1 npm和包的概述
      • 3.3.2 npm初体验
      • 3.3.3 包管理配置文件
      • 3.3.4 包的分类
      • 3.3.5 开发属于自己的包
      • 3.3.6 发布自己开发的包
    • 3.4 模块的加载机制
  • 4.Express
    • 4.1 Express的基本使用
    • 4.2 express路由
      • 4.2.1 路由的介绍
      • 4.2.2 路由的使用
    • 4.3 express中间件
      • 4.3.1 中间件的概念
      • 4.3.2 Express 中间件的初体验
      • 4.3.3 中间件的分类
      • 4.3.4 自定义中间件
    • 4.4使用Express写接口
      • 4.4.1 接口实现
      • 4.4.2 CORS跨域资源共享
      • 4.4.3 JSONP接口
  • 5. MySQL数据库
  • 6 Web开发模式
    • 6.1 身份认证
    • 6.2 session认证机制
    • 6.3 JWT认证机制

1.回顾与思考

浏览器中的JavaScript的组成部分:
在这里插入图片描述

为什么JavaScript可以在浏览器中执行:
在这里插入图片描述

为什么JavaScript可以操作DOM和BOM:
在这里插入图片描述

浏览器中的JavaScript运行环境(运行环境指的是代码正常运行所需的必要环境):
在这里插入图片描述

2. 初识Node.js

2.1 Node.js的简介

Node.js是一个基于Chrome V8引擎JavaScript运行环境,Node.js官网

Node.js中的JavaScript运行环境:
在这里插入图片描述

  • Node.js可以做什么:Node.js作为一个JavaScript的运行环境,仅仅提供了基础的功能和API,然而,基于Node.js提供的这些基础功能,很多强大的工具和框架如雨后春笋,层出不穷,所以学习Node.js,可以让前端程序员胜任更多的工作和岗位:
    • 基于Express框架 ,可以快速构建Web应用
    • 基于Electron框架,可以构建跨平台的桌面应用
    • 基于restify框架,可以快速构建API接口项目
    • 读写和操作数据库、创建实用的命令行工具辅助前端开发、…

2.2Node.js的环境安装

如果希望通过Node.js来运行JavaScript代码,则必须在计算机上安装Node.js环境才能运行。

安装包可以去Node.js官网下载
在这里插入图片描述

  • LTS版本和Current版本的区别:
    • LTS为长期稳定版,对于追求稳定性企业级项目来说,推荐安装LTS版本的Node.js
    • Current为新特性尝鲜版,对热衷于尝试新特性的用户来说,推荐安装Current版本的Node.js,但是Current版本中可能存在隐藏的Bug或安全性漏洞,因此不推荐企业级项目中使用Current版本的Node.js

如何确定Node.js已经安装成功:终端输入命令node -v可查看安装的版本,能看到安装的版本则表示安装成功, 否则没有安装成功
在这里插入图片描述

如何在Node.js环境中执行JavaScript的代码: 在终端进入到js文件目录下, 输入终端指令:node 要执行文件的路径

在这里插入图片描述

注意: 使用tab键, 能够快读不全路径

在终端中使用tab键快速不全路径, mac电脑不知道到支不支持

2.3. fs文件系统模块

fs模块是Node.js官方提供的、用来提供操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。

  • fs.readFile()方法,用来读取指定文件的内容
  • fs.writeFile()方法,用来向指定的文件中写入内容

但是如果想要在JavaScript中,使用fs模块操作文件,则需要使用如下方式导入它:const fs = require(''fs)

2.3.1 fs.readFile()

fs.readFile(path, [options], callback)

参数解读:

  • 参数1:必选参数,字符串,表示文件路径
  • 参数2:可选参数,表示以什么编码格式来读取文件
  • 参数3:必选参数,文件读取完成后,通过回调函数拿到读取信息的结果

在这里插入图片描述

上面方法是正确读取文件的内容, 下面是 读取文件错误的错误信息打印

2.3.2 fs.writeFile()

fs.writeFile(path,data, [options], callback)
  • 参数解读:
    • 参数1: 必选参数,需要指定一个文件的路径
    • 参数2:必须参数,表示写入的内容
    • 参数3:可选参数,表示以什么格式写入文件内容,默认值是utf-8
    • 参数4:必选参数,文件写入完成后的回调函数
    • 注意:只能用来创建文件,不能用来创建路径;重复调用write方法,新写入的内容会覆盖旧的内容

在这里插入图片描述

文件写入成功,则error对象是null, 否则是一个错误对象。

2.3.3 练习-整理考试成绩

在这里插入图片描述

2.3.4 fs模块-路径动态拼接的问题

在使用fs模块操作文件时,如果提供的操作路径.././开头的相对路径时,很容易出现路劲动态拼接错误的问题。
原因: 代码在运行的时候,会以执行node命令是所处的目录,动态拼接出被操作文件的完整路径。
解决方案: 在使用fs模块操作文件时,直接提供完整路径,不要提供./../开头的相对路径,从而防止路径动态拼接的问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • __dirname是一个固定路径,表示当前node文件执行文件所处在的目录
    在这里插入图片描述

2.4 path路径模块

  • path模块:是Node.js官方提供的, 用来处理路径的模块, 它提供了一系列的方法和属性,用来满足用户对路径的处理需求
    • path.join(): 用来将多个路径片段拼接成一个完整的路径字符串
    • path.basename():用来从路径字符串中,将文件名解析出来
    • 注意:如果要在JavaScript代码中,使用path模块处理路径,则需要使用如下的方式先导入它:const path = require('path')

path.join([…paths])

  • paths路径片段的序列
  • 返回值:

在这里插入图片描述

path.basename()的示例代码

在这里插入图片描述

path.extname(): 获取路径中的扩展名部分,语法格式如下path。extname(path)

  • path 必选参数,表示一个路径的字符串
    返回: 返回得到的扩展名字符串

在这里插入图片描述

2.5 http模块

http模块是Node.js官方提供的, 用来创建Web服务器的模块,通过http模块提供的http.createServer()方法,就能方便的把一台普通的电脑,变成一台Web服务器,从而对外提供Web资源服务

当然要使用http模块创建Web服务器,则需要先导入该模块:const http = require('http')

2.5.1 服务器相关的概念

服务器和普通电脑的区别在于,服务器上安装了web服务器软件, 例如:IIS、Apache等。通过安装这些服务软件就能把一台普通的电脑变成一台web服务器

在Node.js中,我们不需要使用这些第三方的web服务器。因为我们可以基于Node.js提供的http模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外听过web服务。

IP地址:表示互联网上每台计算机的唯一地址,因此IP地址具有唯一性。如果把个人电脑比作一台电话,那么IP地址就相当于电话号码,只有在知道对方IP地址的前提下,才能与对应的电脑之间进行数据通信。

IP地址的格式:通常使用点分十进制表示(a.b.c.d)的形式,其中a,b,c,d都是0~255之间的十进制整数。例如:用点份十进制的IP地址(192.168.1.1)

注意:

  1. 互联网中每台Web服务器,都有自己的IP地址,例如:大家可以在Windows的终端中运行ping www.baidu.com命令,即可查看到百度服务器的IP地址
  2. 在开发期间,自己的电脑既是一台服务器,也是一个客户端,为了方便测试,可以在自己的浏览器中输入127.0.0.1这个IP地址,就能发自己的电脑当做一台服务器进行访问了

**端口号:**计算机的端口号,就好想是现实生活中的门牌号一样。通过门牌号,外卖小哥可以在整栋大楼众多的房间中,准确的把外卖送到你手中。

同样的道理,在一台电脑中,可以运行成百上千个web服务器。每个web服务器都对应一个唯一的端口号。客户端发送过来的网络请求,铜鼓端口号,可以被准备地交给对应的web服务器进行处理
在这里插入图片描述

2.5.2 创建最基本的web服务器

  1. 导入http模块
  2. 创建web服务器实例
  3. 为服务器实例绑定request事件,监听客户端的请求
  4. 启动服务器

然后再浏览器输入http://127.0.0.1访问本机, 输出控制台会输出如下信息。
在这里插入图片描述

req请求对象: 只要服务器接受到客户端的请求,就会调用server.on()为服务器绑定的request事假处理函数。如果想要在事件处理函数,访问与客户端相关的数据或属性可以使用如下方式:
在这里插入图片描述

res响应对象: 在服务器request事件处理函数中,如果访问与服务器相关的数据或属性,可以使用如下方式:
在这里插入图片描述

2.5.3 根据不同的url响应不同的html内容

  • 核心实现步骤:
    1. 获取请求的url地址
    2. 设置默认的响应内容为 404 Not found
    3. 判断用户请求的是否为//index.html首页
    4. 判断用户请求是否为/about.html关于页面
    5. 设置Content-Type响应头,防止中文乱码
    6. 使用res.end()把内容响应给客户端

在这里插入图片描述

3. 模块化

在这里插入图片描述
在这里插入图片描述

3.1 模块化的基本概念

模块化:指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解合更换的单元。

编程领域中的模块化,就是遵守固定的规则,把一个大文件拆分成独立并互相依赖的多个小模块。

把代码进行模块化 拆分的好处:

  1. 提高了代码的复用性
  2. 提高了代码的可维护性
  3. 可以实现技术加载

模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的那些规则。
例如:使用什么样的语法格式来引用模块、在模块中使用什么样的语法格式向外暴露成员

模块化规范的好处:大家都遵守同样的模块化规范写代码,降低了沟通成本,极大的方便了各个模块之间的相互调试。利人利己。

3.2 Node.js中模块的分类

Node.js中根据模块来源的不同,将模块化分为了3大类,分别是:

  1. 内置模块:内置模块是有Node.js官方提供的, 例如fs、path、http等
  2. 自定义模块:用户创建的每个.js文件,都是自定义模块
  3. 第三方模块:由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载

3.2.1 加载模块

使用强大的require()方法,可以加载需要的内置模块、用户 自定义那模块、第三方模块进行使用:
在这里插入图片描述

注意:使用require()方法加载其他模块时,会执行被加载模块中的代码。在使用require()加载用户自定义模块期间,可以省略.js的后缀名
在这里插入图片描述

3.2.2 模块作用域

和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域
在这里插入图片描述

模块作用域的好处: 防止了全局变量污染的问题
在这里插入图片描述

3.2.3 向外共享模块作用域中的成员

module对象:在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息,打印如下:
在这里插入图片描述

module.exports对象: 在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。外界用require()方法导入自定义模块时,得到的就是module.exports所指向的对象。

在这里插入图片描述

注意:使用require()方法导入模块时,导入的结果永远以module.exports指向的对象为准。
在这里插入图片描述

exports对象:由于module.exports单词写起来比较复杂,为了简化向外共享成员的代码,Node提供了exports对象,默认情况下,exports和module.exports指向同一个对象。最终共享的结果,还是以module.exports指向的对象为准

在这里插入图片描述

module.exportsexports的使用误区: 时刻谨记,require()模块时,得到的永远是module.exports指向的对象:
在这里插入图片描述

  • Node.js中模块化规范:Node.js遵循了CommonJS模块化规范,CommonJS规定了模块化特性各模块之间如何相互依赖。CommonJS规定:
    • 每个模块内部, Module变量代表当前的模块
    • module变量是一个对象, 它的exports属性,即module.exports是对外的接口
    • 加载某个模块, 其实是加载该模块的module.exports属性。require()方法用于加载模块

3.3 npm与包

3.3.1 npm和包的概述

不同于Node.js中的内置模块与自定义模块, 包是由第三方个人或团队开发出来的,免费供所有人适用。
注意: Node.js中的包都是免费且开源的,不需要付费即可免费下载使用。

由于Node.js的内置模块仅仅提供了一些底层的API,导致在基于内置模块进行开发项目时,效率很低。

包是基于内置模块封装出来的,提供了更加高级的功能,更方便的API,极大提高了开发效率。
包和内置模块之间的关系,类似JQuery和浏览器内置API之间的关系。

  • 搜索包的地址:https://www.npmjs.com
  • 下载包的地址:https://registry.npmjs.org
  • npm,Inc公司除了提供上述地址之外,还提供了一个包管理工具Node Package Manager(简称npm包管理工具),这个工具随着Node.js的安装一起安装到电脑上了,大家可以在终端上执行npm -v命令,来查看电脑上所安装npm包管理工具的版本。

在这里插入图片描述

3.3.2 npm初体验

  • 格式化时间的传统做法:

在这里插入图片描述

  • 格式化时间的高级做法:
    • 使用npm包管理工具,在具体的项目中安装格式化时间的包 monment
    • 使用require()导入格式化时间的包
    • 参考monment的官方API 文档对时间进行格式化

在这里插入图片描述

在项目中安装包的命令:npm install 包的完整名称 , 上述命令还可以简写为npm i 完整包名称

那么初次安装包之后,多了哪些文件?

初次安装包完成后,在项目文件夹下多了一个叫做node_modules的文件夹和package-lock.json的配置文件。
node_modules文件夹用来存放所有已安装大项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包的。
package-lock.json配置文件用来记录node_modules目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等

注意: 程序员不要手动修改node_modules或package-lock.json文件中的任何代码,npm包管理工具会自动维护他们

在这里插入图片描述

默认情况下,使用npm install命令安装包的时候,会自动安装最新版本的包。如果需要指定安装指定版本的包,可以在包名之后,通过@符号指定具体的版本.例如:
在这里插入图片描述

包的版本号是以点分十进制形式进行定义的,总共有三位数字,例如2.24.0,其中每一位数字代表的含义如下:

  • 第一位数字: 大版本
  • 第二位数字:功能版本
  • 第三位数字:Bug修复版本
    版本号的提升规则: 只要前面的版本号增长,则后面的版本号归零。

3.3.3 包管理配置文件

npm 规定,在项目根目录中, 必须提供一个叫做package,.json的包管理配置文件。用来记录与项目有关的一些配置信息。例如:

  • 项目的名称、版本号、描述等
  • 项目中都用到了那些包
  • 哪些包只在开发期间会用到
  • 那些包在开发部署时都需要用到

如果第三方的体积过大,不方便团队之间共享项目源代码。解决方案:共享时剔除node_modules

如何在记录项目中安装了哪些包?
项目根目录中,创建了一个叫做package.json的配置文件,即可用来记录项目中安装了哪些包。从而方便剔除node_modules目录之后,在团队成员之间共享项目的源代码。

注意:在今后的项目开发中,一定要把node_modules文件夹,添加到.gitignore忽略文件中。

  • 快速创建package.json : npm包管理工具提供了一个快捷命令,可以在执行命令时所处的目录中快速创建package.json这个包管理配置文件:
    在这里插入图片描述

  • 如果包含中文和空格,会报名称不合法的错误

  • dependencies结点:package.json文件中,有一个dependencies结点,专门用来记录您使用npm install命令安装了哪些包
    在这里插入图片描述

当我们拿到一个剔除了node_modules的项目之后,需要先把所有的包下载到项目中,才能将项目运行起来。否则会报类似于下面的错误:
在这里插入图片描述

可以运行npm install 命令或者npm i一次性安装所有的依赖包:
在这里插入图片描述

关于卸载包,可以运行命令npm uninstall命令来卸载指定的包,例如:npm uninstall moment, 这里需要注意的是 npm uninstall 命令执行成功后, 会把卸载的包,自动从package.json的dependencies种移除

如果某些包只在项目开发阶段会用到,在项目上线后不会用到,则建议把这些包记录到devDependencies几点中。与之对应的,如果在某些包在开发项目上线之后都需要用到,则建议把这些包记录到dependenies节点中。

可以使用如下命令,将包记录到devDenpendencies节点中:
在这里插入图片描述

有时候下载包的速断比较慢?这是因为要国外的网站,所以有时候会比较慢。
在这里插入图片描述

可以切换npm的下包镜像源:
在这里插入图片描述

为了更方便的切换下包的镜像源,我们可以安装nrm这个小工具,利用nrm提供的终端命令,可以快速产看和切换下包的镜像源。
在这里插入图片描述
在这里插入图片描述

3.3.4 包的分类

  • 项目包:那些被安装到项目的node_modules目录中的包都是项目包, 项目包又分两类:
    • 开发依赖包:被记录到devDenpendencies节点中的包,只在开发期间会用到
    • 核心依赖包:被记录到denpendencies节点中的包,在开发期间和项目上线之后都会用到

在这里插入图片描述

在执行npm install命令时, 如果提供了 -g参数,则会把包安装为全局包。

全局包会被安装到/usr/local/lib/node_modules目录下 npm i 包名 -g (全局安装指定的包)npm uninstall 包名 -g(卸载全局安装的包)

注意:1.只有工具性质的包,才有全局安装的必要性,因为他们提供了好用的终端命令。2、判断某个包是否需要全局才能使用,可以参考官方提供的使用说明即可

  • i5ting_toc:是一个可以把md文档转换成html页面的小工具,使用步骤如下:
    在这里插入图片描述

  • 规范的包结构:一个规范的包,它的组成结构,必须符合以下3点要求:

    • 包必须以单独的目录而存在
    • 包的顶级目录下面必须包含package.json这个包管理配置文件
    • package.json中必须包含name(包的名字)、version(包的版本)、main(包的入口)这三个属性。
    • 注意:以上三点要求是一个规范的包结构必须遵守的格式,关于更多的约束,需要自行参考资料

3.3.5 开发属于自己的包

  • 初始化包的基本结构

    • 新建date-tools文件夹,作为包的根目录
    • 在date-tools文件中,新建如下三个文件:
      • package.json: 包的管理配置文件
      • index.js : 包的入口文件
      • README.md: 包的说明文档
    1. 配置package.json文件:

    在这里插入图片描述

  1. 实现index.js中的格式化时间功能:
    在这里插入图片描述

注意: 我们没有直接导入确定的.js文件,node会去该文件下面去查找是否有package.json文件,然后再看.json文件中是否有指定main属性(入口) 如果 没有则会报错 找不到文件

如果我们里面后面还有很多其他的功能方法, index.js文件中的代码会越来越多,会变得越来越难维护,为了解决这种情况,所以我们把功能相关的代码抽离出来作为一个独立的文件。
在这里插入图片描述

注意:...是展开对象中的每一个属性

  • 编写包的说明文档:包根目录中README.md文件,是包的使用说明文档。通过它,我们可以事先把包的使用说明,以markdown的格式写出来,方便用户参考。 内容包含: 安装方式、导入方式、功能使用介绍、开源协议

3.3.6 发布自己开发的包

访问https://www.npmjs.com/,然后注册一个账号。然后我们需要再终端执行命令npm login,依次输入用户名、密码、邮箱后,即可以登录成功。这里有一个注意点在运行npm login 命令之前,必须先把下包的服务器地址切换为npm 的官方服务器,否则会导致发布包失败

  • 发布包:将终端切换到包的根目录之后,执行npm publish命令,即可将包发布到npm上(注意:包名不能雷同
  • 删除已发布包: 执行npm unpublish 包名 --force命令,即可从npm删除已发布的包。
    • npm unpublish 命令只能删除72小时以内发布的包
    • npm unpublish 删除的包,在24小时内不允许重复发布
    • 发布包的时候要慎重,尽量不要在王npm上发布没有意义的包

3.4 模块的加载机制

模块在第一次加载后会被缓存,这也意味着多次调用require()不会导致模块的代码被执行多次。注意:不论是内置模块、用户自定义模块、还是第三方模块,他们都会优先从缓存中加载,从而提高模块的加载效率

  • 内置模块是有Node.js官方提供的模块,内置模块的加载优先级最高。例如,require(‘fs’)始终返回内置的fs模块,即使在node_modules目录下有名字相同的包也叫做fs

  • 使用require()加载自定义模块时,必须指定以./../开头的路径标识符,在加载自定义模块时,如果没有指定./或则../这样的路劲标识符,则node会把它当做内置模块第三方模块进行加载。

同时,在使用require()导入自定义模块时,如果省略了文件的扩展名,则Node.js会按顺序分别尝试加载以下的文件:

  1. 按照确切的文件名进行加载
  2. 补全.js扩展名进行加载
  3. 补全.json扩展名进行加载
  4. 补全.node扩展名进行加载
  5. 加载失败,终端报错
  • 第三方模块加载机制: 如果传递给require()的模块标识符不是一个内置模块,也没有以./../开头,则Node.js会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块。如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。

在这里插入图片描述

  • 目录作为模块: 当把目录作为模块标识符,传递给require()进行加载的时候,又三种加载方式:
    • 在被加载的目录下查找一个叫做package.json的文件,并寻找main属性,作为require()加载的入口
    • 如果目录里没有package.json文件,或则main入口不存在或无法解析,则Node.js将会视图加载目录下的index.js文件。
    • 如果以上两步都失败了,则Node.js会在终端打印错误信息,报告模块的缺失:Error Cannot find module ‘xxx’

4.Express

什么是Express?

官方给出的概念:Express是基于Node.js平台,快速、开放、极策的Web开发框架。通俗理解Express的作用和Node.js内置的http模块类似,是专门用来创建Web服务器的,其本质就是一个npm上的第三方包,提供了快速创建Web服务器的便捷方法Express中文官网 ,这里安装的是4.17.1版本。

Express能做什么?

对于前端程序员来说,最常见两种服务器,分别是:

  • Web网站服务器:专门对外提供Web网页资源的服务器
  • API接口服务器:专门对外提供API接口的服务器
    使用Express,我们可以方便,快速的创建Web网站的服务器或者API接口服务器

4.1 Express的基本使用

在项目所处的目录中, 运行如下的终端命令,即可将express安装到项目中使用:npm i express@4.17.1

  • 使用express创建基本的web服务器:

在这里插入图片描述

  • 监听GET请求, 我们通过app.get()方法,可以监听客户端的GET请求,具体的语法格式如下:

在这里插入图片描述

  • 监听POST请求,通过app.post()方法,可以监听客户端的POST请求。具体的语法格式如下:

在这里插入图片描述

  • 服务器把内容响应给客户端,通过res.send()方法,可以把处理好的内容,发送给客户端:

在这里插入图片描述

  • 获取URL所带的查询参数:通过req.query对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数:

在这里插入图片描述

  • 获取URL中的动态参数: 通过req.params对象,可以访问到URL中,通过:匹配到的动态参数:

在这里插入图片描述

  • 托管静态资源:express提供了一个非常好用的函数,叫做express.static(),通过它,我们可以非常方便地创建一个静态资源服务器,例如,通过下面代码就可以将public目录下的图片、CSS文件、javaScript文件对外开放了app.user(express.static('public'))

在这里插入图片描述
在这里插入图片描述

  • 托管多个静态资源目录:如果要托管多个静态资源目录,请多次调用express.static()函数:

在这里插入图片描述
注意:访问静态资源文件时,express.stack()函数会提供目录的添加顺序查找所需要的文件

  • 挂载静态资源前缀:如果希望在托管的静态资源访问路径之前,挂在路径前缀,则可以使用如下的方式:

在这里插入图片描述

  • nodemon: 在编写调试Node.js项目的时候, 如果修改了项目的代码,则需要频繁手动close掉,然后再重新启动,非常繁琐。现在,我们可以使用nodemon这个工具,它能够监听项目文件的变动,当代码修改后,nodemon会自动帮我们重启项目,极大方便了开发和调试

在终端执行命令npm install -g nodemon,即可将nodemon安装为全局可用的工具

当基于Node.js编写一个网站应用的时候,传统方式,是运行node app.js,来启动项目,这样做的坏处是,当代码被修改之后,需要手动重启项目。

现在,我们可以将node命令替换为nodemon,使用nodemon app.js来启动项目,这样做的好处:代码被修改之后,会被nodemon监听到,从而实现自动重启动项目的效果。

请添加图片描述

4.2 express路由

4.2.1 路由的介绍

在Express中, 路由指的是客户端的请求服务器处理函数之间的映射关系。

Express中路由分3不分组成, 分别是请求的类型、请求的URL地址、处理函数格式如下:app.METHOD(PATH, HANDLER)
在这里插入图片描述

  • 路由的匹配过程: 每当一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后, 才会调用对应的处理函数。在匹配时,会按照路由的顺序进行匹配,如果请求类型请求的URL同时匹配成功, 则Express 会将这次请求, 转交给对应的function函数进行处理。

注意:按照定义的先后顺序进行匹配,请求类型请求的URL同时匹配成功,才会调用对应的处理函数

4.2.2 路由的使用

在Express 中使用路由最简单的方式, 就是把路由挂载到app上,实力代码如下
在这里插入图片描述

模块化路由:为了方便路由进行模块化的管理,Express 不建议将路由直接挂载到app上, 而是推荐将路由抽离为单独的模块。将路由抽离为单独模块步骤如下:

  1. 创建路由模块对应的js文件
  2. 调用express.Route()函数创建路由对象
  3. 向路由对象上挂载具体的路由
  4. 使用module.express向外共享路由对象
  5. 使用app.user()函数注册路由模块

在这里插入图片描述

我们还可以为路由模块添加前缀, 类似于托管静态资源时, 为静态资源统一挂载访问访问前缀一样,路由模块添加前缀的方式也非常简单:

在这里插入图片描述

4.3 express中间件

4.3.1 中间件的概念

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

Express中间件的格式: Express的中间件,本质上就是一个function处理函数,Express中间件的格式如下:
在这里插入图片描述
注意: 中间件函数的形参列表中, 必须包含next参数,而路由处理函数中只包含req和res

上面多次提到next()函数,那么next()函数的作用是什么了?

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

4.3.2 Express 中间件的初体验

那么我们如何定义一个中间件函数,可以通过如下方式:
在这里插入图片描述

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

定义中间件的简化形式:
在这里插入图片描述

中间件的作用:多个中间件之间,共享同一份req和res,基于这样的特性,我们可以在上游的中间件,统一为req或res对象添加自定义的属性或方法, 供下游的中间件或路由进行使用。
在这里插入图片描述

在这里插入图片描述

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

除了全局中间件之外,我们还可以使用局部中间件,所谓局部生效的中间件, 就是不适用app.use()定义的中间件, 叫做局部生效中间件
在这里插入图片描述

注意:不使用app.use()注册的中间件都是局部中间件

跟全局中间件一样,我们一样也可以同时定义多个中间件。我们可以通过如下两种等价的方式,使用多个局部中间件
在这里插入图片描述

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

4.3.3 中间件的分类

为了方便大家理解和记忆中间件的使用, Express官方把常见的中间件用法,分成了5大类,分别是

  • 应用级别的中间件
  • 路由级别的中间件
  • 错误级别的中间件
  • Express内置的中间件
  • 第三方的中间件

通过app.use()app.get()app.post(),绑定到APP实例上的中间件, 叫做应用级别的中间件。代码示例如下:
在这里插入图片描述

绑定到express.Router()实例上的中间件,叫做路由级别的中间件, 它的想法和应用级别中间件没有任何的区别, 不过应用级别中间件是绑定到app实力上, 路由级别中间件绑定到router实例上:
在这里插入图片描述

错误级别的中间件的作用:专门用来捕获整个项目中发生的异常错误, 从而防止项目异常崩溃的问题。

格式:错误级别的中间件function处理函数中,必须有4个参数,形参顺序从前到后,分别是(err,req,res,next)。
在这里插入图片描述
注意:错误级别的中间件,必须注册在所有路由之后!

  • Express内置的中间件:自从Express 4.16.0版本开始Express 内置了3个常用的中间件,极大的提高了Express项目的开发效率和体验:
    • express.static:快速托管静态资源的内置中间件,例如:HTML文件、图片、CSS样式等(无兼容性
    • express.json: 解析JSON格式的请求体数据(有兼容性,仅在4.16.0+版本中可用
    • express.urlencoded: 解析URL-encoded格式的请求数据(有兼容性,仅在4.16.0+版本中可用

在这里插入图片描述

第三方的中间件指的是非Express官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件。在项目开发中,大家可以按需下载并配置第三方中间件,从而提高项目的开发效率。例如在express@4.16.0之前的版本中经常使用body-parser这个第三方中间件,来解析请求数据,使用步骤如下:

  1. 运行npm install body-parser安装中间件
  2. 使用require导入中间件
  3. 调用app.use()注册并使用中间件
    在这里插入图片描述

注意:Express内置的express.urlencoded中间件,就是基于body-parser这个第三方中间件进一步封装出来的

4.3.4 自定义中间件

学习上述中间件的知识 ,我们可以尝试写一个自己的中间件。接下来我们手动模拟一个类似于express.unlencoded这样的中间件, 来解析POST提交服务器的表单数据。实现步骤如下:

  1. 定义中间件
  2. 监听req的data事件(在中间件中,需要监听req对象的data事件,来获取客户端发送到服务器的数据。如果数据量比较大,无法一次性发送完毕,则客户端会把数据切割后,分批发送到服务器。所以data事件可能会触发多次,每一次触发data事件时,获取到数据只是完整数据的一部分,需要手动对接收到的数据进行拼接。)
  3. 监听req的end事件(当请求数据接受完毕之后,会自动触发req的end事件。因此,我们可以在req的end事件中,拿到并处理完整的请求数据。)
  4. 使用querystring模块解析请求体数据(Node.js内置一个querystring模块,专门用来处理查询字符串。通过这个模块提供的parse()函数,可以轻松把查询字符串,解析成对象的格式的数据)
  5. 将解析出来的数据对象挂在为req.body(上游的中间件和下游的中间件及路由之间,共享同一份req和res。因此我们可以将解析出来的数据,挂在为req的自定义属性,命名为req.body,供下游使用)
  6. 将自定义中间件封装为模版

在这里插入图片描述

上述我们已经完成了我们自己中间件的功能实现, 但是我们发现我们的中间件的逻辑代码和主模块的代码在一起, 这样的代码结构不太好管理, 为了优化代码的结构,我们可以把自定义的中间件函数,封装为独立的模块,

在这里插入图片描述

4.4使用Express写接口

4.4.1 接口实现

在这里插入图片描述

上述html使用的jQuery是在线版本的相关地址-免费CND服务

编写接口之后,当我们进行接口测试的时候,发现浏览器报了如下错误:
在这里插入图片描述

4.4.2 CORS跨域资源共享

上述编写的接口,我们也发现了,存在一个很严重的问题: 不支持跨域请求。解决接口跨域问题的方案主要有两种:

  1. CORS(主流的解决方案,推荐使用)
  2. JSONP(有缺陷的解决方案:支持支GET请求)

我们可以使用cors中间件解决跨域问题, cors是Express的一个第三方插件,通过安装和配置cors中间件,可以很方便地解决跨域问题。使用步骤如下:

  • 运行npm install cors中间件
  • 使用const cors = require('cors')导入中间件
  • 在路由之前调用app.use(cors())配置中间件

在这里插入图片描述

我们可能会有一个疑问? 到底什么是CORS?

cors(Cross-Origin Resource Sharing,跨域资源共享)由一系列HTTP响应头组成,这些HTTP响应头决定浏览器是否阻止前端JS代码跨域获取资源

浏览器的同源安全策略默认会组织网页’跨域’获取资源,但如果接口服务器配置了CORS相关的HTTP响应头,就可以接触浏览器的跨域访问限制。

在这里插入图片描述

  • CORS的注意事项:
    • CORS主要是在服务器进行配置,客户端浏览器无须做任何额外的配置,即可请求开启了CORS的接口。
    • CORS在浏览器中有兼容性,只支持XMLHttpRequestLevel2的浏览器,才能正常访问开启了CORS的服务端接口,例如IE10+、chrome4、FireFox3.5+

CORS响应头部:Access-Control-Allow-Origin,响应头部中可以携带该字段,其语法如下:Access-Control-Allow-Origin: | *,其中origin参数指定了允许访问该资源的外域URL`。

例如,下面的字段值将只允许来自http://itcast.cn的请求:
在这里插入图片描述

如果指定了Access-Control-Allow-Origin的字段值为通配符 *,表示允许来自任何域的请求,示例代码如下:res.setheader('Access-Control-Allow-Origin', '*')

CORS响应头Access-Control-Allow-Headers默认情况下,CORS仅支持客户端像服务器发送如下的9个请求头:Accept、Accept-Language、Content-Lanaguage、DPR、Downlink、Viewport-Width、Width、Content-Type(值仅于text/plain、mulitpart/from-data、application/x-www-form-urlencoded三者之一)

如果客户端向服务端发送了额外的请求头信息, 则需要再服务器,通过Access-Control-Allow-Header对额外的请求头进行声明,否则这次请求会失败

在这里插入图片描述

CORS响应头部Access-Control-Allow-Methods,默认情况下,CORS仅支持客户端发起的GET、POST、HEAD请求,如果客户端希望通过PUT、DELETE等方式请求服务器资源,则需要再服务器端,通Access-Control-Allow-Methods指明实际请求所允许使用的HTTP方法
在这里插入图片描述

CORS请求的分类,客户端在请求CORS接口时,根据请求方式请求头的不同,可以将CORS的请求分成两大类,分别是:简单请求预检请求

简单请求:就是满足请求方式是GET、POST、HEAD三者之一, HTTP头部信息不超过上述的9种字段,无自定义表头。

预检请求: 只要符合其中一个要求,都需要进行预检请求。请求方式为GET、POST、HEAD之外的请求Method类型, 请求头中包含自定义头部字段,向服务器发送了application/json格式的数据

4.4.3 JSONP接口

浏览器端通过<script>标签的src属性,请求服务器上的数据,同时,服务器返回一个函数的调用,这种请求数据的方式叫做JSONP。其特点:

  • JSONP不属于真正的Ajax请求,因为它没有使用XMLHttpRequest这个对象。
  • JSONP仅支持GET请求,不支持POST、PUT、DELETE等请求

创建JSONP请求的注意事项:如果项目中已经配置了CORS跨域资源共享,为了防止冲突,必须在配置CORS中间件之前申明JSONP的接口,否则JSONP接口会被处理成开启了CORS的接口。

使用JSONP的接口步骤:

  1. 获取客户端发来的回调函数名字
  2. 得到要通过JSONP形式发送给客户端的数据
  3. 根据前两部得到的数据,拼接出一个函数调用的字符串
  4. 把上一步拼接得到的数据,响应给客户端script标签进行解析执行
    在这里插入图片描述

5. MySQL数据库

关于MySQL数据一些操作数据库的指令可以参考文章Java学习-MySQL数据库

这里主要介绍下载Express中怎么使用数据库。首先在项目中操作数据的步骤:

  1. 安装操作MySQL数据库的第三方模块(mysql
  2. 通过mysql模块链接到MySQL数据库
  3. 通过mysql模块执行SQL语句

在这里插入图片描述

mysql模块是托管与npm上的第三方模块。它提供了Node.js项目中链接操作MySQL数据库的能力。想要在项目中使用它,需要将mysql安装为项目的依赖包:npm install mysql

在使用mysql模块操作MySQL数据之前,必须先对mysql模块进行必要的配置,主要的配置步骤如下:
在这里插入图片描述

调用db.query函数,指定要执行SQL语句,通过回调函数那道执行的结果:
在这里插入图片描述

6 Web开发模式

6.1 身份认证

目前主流的Web开发者模式有两种,分别是:

  1. 基于服务端渲染的传统Web开发模式
  2. 基于前后端分离的新型Web开发者模式

服务端渲染的概念:服务器发送给客户端的HTML页面,是在服务器通过字符串的拼接,动态生成的。因此,客户端步需要使用Ajax这样的技术额外请求页面的数据。

在这里插入图片描述

服务端渲染的优缺点:

  • 优点:
    • 前端耗时少,因此服务端负责动态生成HTML内容,浏览器只需要直接渲染页面即可,尤其是移动端,更省电。
    • 有利于SEO,因为服务器响应是完成的HTML页面内容,所以爬虫更容易爬取获得信息,更有利于SEO
  • 缺点:
    • 占用服务器资源,即服务器完成HTML页面的拼接,如果请求较多,会对服务器造成一定的 访问压力
    • 不利于前后端分离,开发效率低,使用服务端渲染,则无法进行分工合作,尤其对于前端复杂度高的项目,不利于项目高效开发。

前后端分离的开发模式:前后端分离的开发模式,依赖于Ajax技术的广泛应用。简而言之,前后端分离的Web开发模式,就是后端只负责提供API接口,前端使用Ajax调用接口的开发模式

前后端分离的优缺点:

  • 优点:
    • 开发体验好,前端专注于UI页面的开发,后端专注于api的开发,切前端有更多的选择
    • 用户体验好,Ajax的技术广泛应用,极大的提高了用户的体验,可以轻松实现页面的局部刷新。
    • 减轻了服务器端的渲染压力。因此页面最终在每个用户的浏览器中生成的
  • 缺点:
    • 不利于SEO。因为完整的HTML页面需要再客户端动态拼接万完成,所以爬虫无法爬取页面的有效信息。(解决方案:利用Vue、React等前端架构的SSR(server side rende)技术能够很好的解决SEO问题!)

关于如何选择Web开发模式?

不谈业务场景而盲目选择使用何种开发模式都是耍流氓.

  • 比如企业级网站,主要功能展示没有复杂的交互,并且需要良好的SEO,则这时我们就需要使用服务端渲染
  • 而类似后台管理项目,交互性比较强,不需要考虑SEO,那么久可以使用前后端分离的开发模式。

另外,具体使用何种开发模式并不是绝对的,为了同时兼顾了首页的渲染速度和前后端分离的开发效率,一些网站采用了首屏服务端渲染+其它页面点后端分离的开发者模式。

什么是身份认证?
身份认证(Authentication)又称’身份验证‘、鉴权,是指,通过一定的手段,完成对用户身份的确认。 在Web开发中,涉及到用户身份认证,例如:各大网站的手机验证码登录、邮箱密码登录、二维码登录

不同开发模式下的身份认证, 对于服务端渲染前后端分离这两种开发模式来说,分别有着不同的身份认证方案:

  • 服务端渲染推荐使用Session认真机制
  • 前后端分离推荐使用JWT认证机制

6.2 session认证机制

  • HTTP协议的无状态性: 了解HTTP协议的无状态是进一步学习Session认证机制的必要前提。HTTP协议的无状态性,指的是客户端的每次HTTP请求都是独立的,连续多个请求之间没有直接关系,服务器不会主动保留每次HTTP请求的状态。

在这里插入图片描述

  • 如何突破HTTP无状态的限制:对于超市来说,为了方便收银员在进行结算时给VIP用户打折,超市可以为每个VIP用户发放会员卡。

在这里插入图片描述
注意: 显示生活中会员卡身份认证机制,在Web开发中专业术语叫做Cookie

  • Cookie:指存储在用户浏览器中的一段不超过4KB的字符串。它由一个名称(Name)、一个值(value)和其他几个用于Cookie有效期、安全性、使用范围的可选属性组成, 不同域名下的Cookie个字独立,每当客户端发起请求时,会自动当前域名下所有未过期的Cookie一同发送到服务器。
  • Cookie的几大特性:自动发送、域名独立、过期时限、4KB限制。

Cookie在身份认证中的作用: 客户端在第一次请求服务器的时候,服务器通过通过响应头的形式,向客户端发送一个身份认证的Cookie,客户端会自动将Cookie保存在浏览器中。
随后,当客户端浏览器每次请求服务器的时候, 浏览器会自动将自动将身份认证相关的Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。

在这里插入图片描述

由于Cookie是存储在浏览器中的,而且浏览器也提供了读写Cookie的API,因此Cookie很容易被伪造, 不具备安全性,因此不建议服务器将重要的隐私数据,通过Cookie的形式发送给服务器。
在这里插入图片描述
注意: 千万不要使用Cookie存储重要且隐私的数据!比如用户的省份信息、密码等

为了防止客户伪造会员卡,收银员在拿到客户的会员卡之后,可以在收银机上进行刷卡认证,只有收银机确认存在的会员卡,才能被正常使用。

在这里插入图片描述

Session认证机制的工作原理:
在这里插入图片描述

在Express中使用Session认证, 首先我们需要安装express-session中间件,既可以在项目中使用

在这里插入图片描述

当express-session中间件配置成功后, 即可通过req-session来访问和使用session对象,从而存储用户的关键信息:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.3 JWT认证机制

Session认证机制需要配合Cooke才能实现,由此Cookie默认不支持跨域访问,所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域Session认证。

注意:

  • 当前段请求后端接口不存在跨域问题的时候,推荐使用Session身份认证机制。
  • 当前端需要跨域请求后端接口的时候,不推荐使用Session身份认证机制,推荐使用JWT认证机制。

JWT的工作原理
在这里插入图片描述

  • 用户的信息通过Token字符串的形式,保护在客户端浏览器中,服务器通过还原Token字符串的形式来认证用户的身份

JWT通常由三部分组成,分别是Header(头部)、Payload(有效荷载)、Signature(签名),三者之间使用英文的.分隔,格式如下:Header.Payload.Signature

  • Payload部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串
  • Header和Signature是安全性相关的部分,只是为了保证token的安全性。

在这里插入图片描述

如何使用JWT?

客户端收到服务器返回的JWT之后,通常会将它存储在localStoragesessionStorage中。此后,客户端每次与服务器通信,都需要带上这个字符串,从而进行身份认证。推荐的做法就是把JWT放在HTTP请求头的Authorization字段中,格式如下:Authorization: Bearer <token>

如果想要在项目中使用JWT相关功能,需要安装两个相关的包;npm install jsonwebtoken express-jwt

在项目中为了保证JWT字符串的安全性,防止JWT字符串在网络传输过程中被别人破解,我们需要专门定义一个用于加密解密secrt秘钥:

  1. 当生成JWT字符串的时候,需要使用secret密钥对用户信息进行加密,最终得到加密好的JWT字符串
  2. 当把JWT字符串解析还原成JSON对象的时候,需要使用secret密钥进行解密

定义一个密钥,密钥本质是一个字符串,例如:const secretKey = "itedad NO1 @"

在这里插入图片描述
客户端每次在访问那些有权限的接口的时候,都需要主动在请求头中的Authorization字段,将token字符串发送到服务器进行身份验证。此时,服务器可以通过express-jwt这个中间件,自动将客户端发送过来的Token解析还原成JSON对象。

在这里插入图片描述

  • unless方法是设置那些接口,不需要使用访问权限。
    注意:只要配置成功了express-jwt这个中间件,解析出来的信息可以通过auth来访问

当使用express-jwt解析Token字符串时,如果客户端发送过来的Token字符串过期不合法,会产生一个解析失败的错误,影响项目的正常运行,我们可以通过Express的错误中间件,捕获整个错误并进行相关处理,示例代码如下:

在这里插入图片描述

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

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

相关文章

移动app安全测试工具好物分享

移动互联网时代&#xff0c;我们的生活和工作深受移动app的影响。随着移动app的广泛应用&#xff0c;安全问题成为人们最关注的话题之一。移动app安全除了和软件开发密不可分之外&#xff0c;软件测试的作用也是不容忽视的。移动app安全测试是指测试人员利用各种测试手段验证Ap…

Java之注解

注解1.1 注解的概念1.2 内置注解1.3 元注解1.4 自定义注解1.1 注解的概念 Annotation 是从JDK5.0 开始引入的新技术 Annotation的作用&#xff1a; 不是程序本身&#xff0c;可以对程序做出解释&#xff08;这一点和注释comment没什么区别&#xff09;可以被其他程序&#xff…

解读场景化视频制作工具的实现过程

内容视频化正当其时&#xff0c;企业级智创工具创造新价值。全领域的内容视频化已是显性之势&#xff0c;其不仅覆盖传媒行业&#xff0c;更多泛行业正在以视频化内容的多元姿态创造新的商业价值。于是&#xff0c;不仅新闻传媒行业在超前体验智能化视频创造的效能红利&#xf…

ClickHouse进阶篇-多表连接物化视图

简介 在写这篇文章的时候doris 1.2 的物化视图只是支持单表建立物化视图&#xff0c;现在说下ClickHouse多表的物化视图。 前言 本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理&#xff08;OLAP&#xff09;的开源分析引擎 ClickHouse&#xff0c;因…

蓝库云|ERP系统在企业数字化转型中最常用的八大功能

ERP系统和与企业数字化转型 随着数字化发展的兴起&#xff0c;规划和管理已成为企业产生富有成效的成果的关键。许多企业采用了企业资源规划 (ERP) 等先进工具&#xff0c;使企业所有者能够以高效的方式规划和管理其资源和运营。 ERP系统负责整合业务的不同流程并向决策者提供…

【LeetCode】剑指 Offer 20. 表示数值的字符串 p127 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/ 1. 题目介绍&#xff08;20. 表示数值的字符串&#xff09; 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff…

【软件测试】还在背锅?接口自动化测试5个测试点(重要)8年测试的总结......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 功能测试 接口的功能…

什么是数据可视化,数据可视化有什么价值

“数据可视化”这个词看上去似乎让人有点摸不着头脑&#xff0c;但其实在实际生活中也有类似的应用。举个例子&#xff0c;媒婆给你介绍对象&#xff0c;前面给你铺垫一堆&#xff0c;如五官端正、身材修长、皮肤雪白&#xff08;各种繁杂的信息描述&#xff09;&#xff0c;你…

Java集合(一)

目录 Java集合框架概述 Collection接口 Collection接口方法 Iterator迭代器接口 使用 Iterator 接口遍历集合元素 Iterator接口的方法 Iterator接口remove()方法 使用 foreach 循环遍历集合元素 Java集合框架概述 一方面&#xff0c; 面向对象语言对事物的体现都是以对…

一文搞懂华为的HCIA-Datacom(学习视频+模拟器+考试题库)

一、华为认证是什么&#xff1f; 二、为什么要选择华为认证 三、HCIA-Datacom的介绍 1.通过认证验证的能力 中小型园区网络的规划设计、部署实施、运维和优化能力 2.建议掌握的知识 路由交换原理、WLAN基本原理、网络安全基础知识、网络管理与运维基础知识、以及SDN与编程自动…

全球十大正规贵金属交易价格走势app软件排名(2023口碑榜)

最近&#xff0c;随着人们对贵金属产品的需求增加&#xff0c;贵金属价格走势变得更加复杂。为了更好地掌握贵金属市场的变化&#xff0c;很多投资者都在寻找一款可以追踪贵金属价格走势的app软件。 针对这一需求&#xff0c;现在已经有多款贵金属价格走势软件涌现在市场上。…

SSRF学习 3

目录 <1> 什么是SSRF&#xff1f; <2> 通常SSRF会发生在哪些位置&#xff1f; <3> 测试流程 <4> Weblogic-ssrf 复现 (1) 漏洞存在点 (2) 注入HTTP头&#xff0c;利用Redis反弹shell (3) 修复方案 <1> 什么是SSRF&#xff1f; SSRF(Serv…

CentOS安装配置Nginx

一、下载Nginx&#xff1a; 说明&#xff1a; 1&#xff09;因为这是一个stable稳定版本。 2&#xff09;Mainline version: 开发版&#xff1b;Stable version: 稳定版&#xff1b;Legacy versions: 早期版本&#xff1b; 二、上传到Linux中&#xff1a; 三、解压文件&#…

HBase集群部署

目录 一、前期准备 二、HBase下载 1. 查看HBase与hadoop版本对应关系 2. hbase的下载 3. 将hbase的tar包上传到linux 下 二、安装hbase 1. 解压 2. HBase的文件配置 主机名hadoop版本HBase版本hadoop安装路径Hbase安装路径HadoopMaster3.3.02.4.3/home/hadoop/softwareh…

【SSM】篇二:注解开发与AOP

文章目录1、注解开发1.1 注解开发定义bean1.2 纯注解开发模式1.3 注解开发Bean的作用范围和生命周期1.4 注解开发依赖注入1.5 注解开发管理第三方Bean2、Spring整合案例2.1 Spring整合mybatis2.2 Spring整合Junit3、AOP3.1 AOP思想入门案例3.2 AOP工作流程3.3 AOP切入点表达式3…

pg逻辑复制详解

目录 什么是逻辑复制 逻辑解析 复制槽 output plugin ​​​​​​​几个常见的outputplugin 几个能手动接收解析数据的函数和工具 逻辑解析测试1&#xff1a;观察用2个不同的output plugin解析数据 逻辑解析测试2&#xff1a;使用pg_recvlogical工具接收逻辑解析数据&am…

服务器配置 | 在Windows本地显示远程服务器绘图程序

文章目录方法1&#xff1a;在MobaXterm的终端输入指令方法2&#xff1a;在Pycharm中运行前提概要&#xff0c;需要在本地Windows端显示点云的3d可视化界面 对于点云的3d可视化一般有两种方法&#xff0c;open3d显示或者是mayavi显示。这两个库都可以使用pip install来实现安装…

给正在准备PMP考试的同学一些建议

去年年尾参与了pmp考试&#xff0c;顺利通过&#xff0c;并得了5A&#xff0c;让我小小激动了一下。在出来结果之前&#xff0c;我也是坚信自己能过&#xff0c;得知是5A&#xff0c;当然也是非常高兴。话不多说&#xff0c; 先贴图&#xff1a; 这里我将要说一下我都是如何备…

Modbus网关在锂电池干燥箱的应用

在锂离子电池生产过程中&#xff0c;将正负极片辊压绕卷再放入电池盒之后&#xff0c;须对锂电池电芯极组进行烘烤干燥。相信大家也了解水分对锂电池的性能影响是很大的&#xff0c;需要注液前在装配车间将锂离子电池电芯内部的水分去除&#xff0c;以免影响锂电池质量。在锂电…

星光2开发板使用ECR6600U无线wifi网卡的方法

visionfive2 开发板性能还是不错的&#xff0c;有些人买的时候会带一个无线wifi网卡&#xff0c;但是官方提供的操作系统没有驱动。 所以需要自己编驱动&#xff08;他大爷的&#xff09;。 还好有人已经踩过坑了。 星光2之USB无线网卡使用教程【新增RTL8832AU WiFi6双频无线…