node_global环境变量(node环境变量的作用)

node_global环境变量(node环境变量的作用)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p></p> 

讯享网

什么是Node.js

  • 是一种基于Chrome V8引擎的运行时环境,用于在服务器端运行JavaScript代码
  • Node.js是JavaScript的后端运行环境
  • 注意:Node.js中无法调用和等

13 1const arr = [0, 1, 2, [3, 4, [5, 6, [7, 8]]]]2​3// 提取深度为默认值:14console.log(arr.flat()); // 输出:[0, 1, 2, 3, 4, [5, 6, [7, 8]]]5​6// 提取深度为默认值:37console.log(arr.flat(3)); // 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8]8​9// 提取深度为默认值:3010console.log(arr.flat(30)); // 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8]11​12// 不会改变原数组的值13console.log(arr) // 输出:[0, 1, 2, [3, 4, [5, 6, [7, 8]]]]js

Node.js可以做什么

  1. 基于框架,可以快速构建Web应用
  2. 基于框架,可以构建跨平台的桌面应用
  3. 基于框架,可以快速构建API接口项目
  4. 读写和操作数据库、创建使用的命令工具辅助前端开发、etc…

学习过程

  1. Node.js内置API模块(fs、path、http等)
  2. 第三方API模块(express、MySQL等)

区分LTS版本和Current版本的不同

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

初学者安装LTS版本既可以了

如何在Node.js环境中执行JavaScript代码

在vscode中打开终端,输入:

如:

image-20230921164009301
讯享网

在终端输入可以清空终端

更换版本

使用nvm插件来更换版本(nvm需要安装)。

在安装了nvm的前提下,在控制台中输入,可以查看nvm的使用

在使用nvm更换node版本的时候,npm同样会换

快速启动服务

需要使用nodemon插件,在管理员终端中,输入:

讯享网

使用时,只需要在终端中,使用nodemon启动服务即可:

 

这时,更改了app.js 的代码并保存之后,会自动重启服务

什么是fs模块

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

  • 在JavaScript中使用来操作文件前,需要导入
    讯享网

使用fs模块

读取指定文件中的内容

用法

  • 必选参数,字符串,表示文件的路径
  • 必选参数,字符串,表示以什么编码格式来读取文件,默认是utf8
  • 必选参数,回调函数,文件读取完成后的回调函数
    • err
      读取文件成功时,值为 ,所以这时的是没有
      读取文件失败时,值为
      当读取文件失败时,打印 ,会在终端输出失败的信息


    • dataStr
      读取文件成功时,值为
      读取文件失败时,值为

向指定的文件中写入内容

用法

  • 必选参数,字符串,表示文件的路径
  • 必选参数,表示要写入的内容
  • 可选参数,字符串,表示以什么编码格式来写入文件,默认是utf8
  • 必选参数,回调函数,文件写入完成后的回调函数
    • err
      写入文件成功时,值为
      写入文件失败时,值为
      当写入文件失败时,打印 ,会在终端输出失败的信息


注意

  1. 当输入的路径没有文件,则会创建一个文件,然后进行写入内容
    如:
     
  2. 新写入的内容会覆盖原来的内容

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

在使用fs模块操作文件时,如果提供的操作路径是以或开头的相对路径时,很容易出现路径动态拼接错误的问题

原因:代码在运行的时候,会执行Node命令时所在的目录,动态拼接出**作的文件的完整路径

如:

讯享网

image-20230923164220567

代码访问路径:

如何解决

<p>直接使用需要读取的文件的完整路径&#xff0c;但是不利于维护<br /> <strong>(不建议使用的方法)</strong></p> 

  • 讯享网<p>使用(前面时两个下划线)&#xff0c;它代表文件所在的位置</p> <pre></pre> <p><img src="https://img-blog.csdnimg.cn/img_convert/d640d1ce0151b26cfd780ac8d.png" alt="image-" /></p> <p><mark>完整用法</mark>&#xff1a;</p> <pre></pre> 

    什么是path路径模块

    是官方提供的、用来处理路径的模块,它提供了一系列的方法和属性,用来满足用户对路径的处理和需求

    • 在中使用处理路径前,需要先导入
       

    使用path路径模块

    路径拼接

    作用:将多段路径拼接成一段路径,会以字符串的形式返回出来

    用法

    • 多个路径,用逗号分隔

    例子

    讯享网
    获取路径中的文件名

    作用:可以获取路径中指向的文件,会以一个字符串的形式返回

    用法

    • 必选参数,表示一个路径的字符串
    • 可选参数,表示文件以什么结尾的

    例子

     

    image-20230923191433615

    获取文件的扩展名

    用法:,扩展名会以一个字符串的形式返回

    • :表示一个路径的字符串

    例子

    讯享网

    什么是http模块

    是Node.js官方提供的用来创建web服务器的模块

    • 服务器:在网络节点中,负责对外提供网络资源的电脑
    • 客户端:在网络节点中,负责消费资源的电脑

    在中使用处理路径前,需要先导入

     
       

    服务器相关的概念

    IP地址

    就是互联网上每台计算机的唯一地址,因此IP地址具有唯一性

    • (a.b.c.d),其中a、b、c、d都是0~255之间的十进制数
      如:(192.168.1.1)

    互联网中每台Web服务器都有自己的IP地址,例如,可以在控制终端中输入来查看百度服务器的IP地址

    域名和域名服务器

    因为不便于记忆,所以发明了一套字符型地址方案,即所谓

    和是一一对应的关系,这份关系存放在一种叫做域名服务器(DNS(简称), Domain name server)的电脑中。

    对应的域名是

    端口号

    端口号就好比每个小区中的门牌号

    在一台电脑中,可以运行很多个web服务,每一个web服务就像一个小区中的屋子一样,可以通过门牌号来找到该这个小区的这间屋子,而这个门牌号就是这个web服务的端口号

    注意:在实际应用中,有且仅有URL中的80端口可以被忽略

    一个web服务中包含了多个文件(类型可相同),如:

    1. HTML文件
    2. CSS文件
    3. JavaScript文件
    4. 图片文件
    5. 数据库文件
    6. 配置文件
    7. 服务器脚本文件

    创建web服务器

    分为4步:

    1. 导入http模块
      讯享网
    2. 创建web服务器示例

      调用方法,即可快速创建一个web服务器示例

       
           
    3. 为服务器示例绑定request事件,监听用户端的请求

      使用的方法,它和DOM中的作用类似

      • :可选参数,是请求对象,里面包含了相关的属性或数据
        • :是客户端请求的 地址(只显示端口号后面的部分URL)
        • :是客户端请求类型
      • :可选参数,响应对象,里面包含了相关的数据或属性
        • :向客户端发送指定的内容,并结束这次请求的处理过程,
          • 为发送的内容
        • :设置响应头
          • :需要设置的响应头
          • :需要设置的响应头的值
      讯享网

      解决中文乱码问题

      当调用方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式

       
           
    4. 启动服务器

    使用的方法

    讯享网
     

    什么是模块化

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

    • 简单来说,就是遵守固定的规则,把一个大文件独立并互相依赖的多个小模块
      优点:
      1. 提高了代码的复用性
      2. 提高了代码的可维护性
      3. 可以实现按需加载

    模块化规范

    模块化规范就是对代码进行模块化的拆分与结合时,需要遵守的那些规则

    如:

    • 使用什么样的语法格式来引用模块
    • 在模块中使用什么样的语法规范向外暴露程艳

    好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本

    Node.js中模块的分类

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

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

    加载模块

    使用方法,可以加载需要的内置模块自定义模块第三方模块

    讯享网

    注意:使用方法加载其他模块时,会执行被加载模块中的代码

    Node.js中的模块作用域

    是什么:和函数作用域类似,在自定义模块中定义的变量方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域

    好处:防止全局变量污染的问题

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

    module对象

    在每个js自动定义模块中都有一个,它里面存储了和当前模块有关的信息

    如:

    image-20230926161337166

    对象向外共享作用域中的成员

    外界使用 方法导入自定义模块时,得到的就是所指向的对象

    如:

     
        
    讯享网

    终端输出结果如下

    image-20230926163450535

    注意:由于单词写起来比较复杂,Node提供了,默认情况下,和指向同一个对象。最终共享的结果,但是读取到的对象还是以指向的对象为准

     
       
    exports和module.exports的使用误区

    重点:使用时,得到的永远是指向的对象
    他们两个本来都是指向一个对象,但是,对其中一个进行了对象重赋值(即exports = {})后,两个就不指向同一个对象

    1. 讯享网
    2.  
    3. 讯享网
    4.  

    Node.js中的模块化规范

    遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖

    规定:

    1. 每个模块内部,module变量代表当前模块
    2. module变量是一个对象,他的exports属性(即)是对外的接口
    3. 加载某个模块,其实是加载该模块的属性,方法用于加载模块

    什么是包

    Node.js中的第三方模块又叫做

    包的来源

    不同于中内置模块与自定义模块,包是由第第三方个人或团队开发出来的

    为什么需要包

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

    包的好处包是基于内置模块封装出来的,提供了更高级更方便的API,极大提高了开发效率

    如何下载包

    包的搜索网站,利用前面的网站来搜索需要的包,

    在安装Node.js的时候,同时安装了一个包管理工具,叫Node Package Manager(简称npm),利用这个包管理工具来安装所需要的包

    如何用npm安装包(需要在终端中输入)

    讯享网

    上述的装包命令,可以简写成如下格式:(将 简写成 )

     
        

    注意:在那个文件夹下输入,则包就下在那个文件夹下

    上面的方法会默认安装最新的包

    如果想安装指定的版本,则在包的后面加上(以moment包为例)

    讯享网

    包的语义化版本规则

    包的版本号是以”点分十进制“形式进行定义的,总共有三位数字,如:

    其中每一个数字所代表的含义如下:

    • 第1位数字:大版本(地层更新后,数字 +1)
    • 第2位数字:功能版本(更新功能后,数字 +1)
    • 第3位数字:Bug修复版本(修完Bug后,数字 +1)

    包管理配置文件

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

    • 项目的名称、版本号、描述等
    • 项目中都用到了那些包
    • 哪些包只在开发期间会用到
    • 哪些包在开发和部署时都用到
    多人协作问题

    在整个项目的体积中,第三方包的体积占比远远大于项目源代码的

    问题:第三方包的体积过大,不方便团队成员之间共享项目源代码

    解决方法:共享时剔除

    如何记录项目中安装了哪些包

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

    所以,在将项目上传到GitHub时,要把node_modules文件夹添加到.gitignore忽略文件中

    快速创建package.json

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

     
        

    注意

    1. 上述命令只能在英文的目录下成功运行,所以,项目文件夹的名称一定要使用英文命名,不要使用中文,不能出现空格
    2. 运行命令安装包的时候,npm包管理工具会自动把报的名称和版本号记录到中
    3. 对于目前来说,安装第一个包时,会自动创建一个文件
    dependencies节点

    文件中,有一个,专门用来记录你使用命令安装了哪些包

    如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到 节点中

    一次性安装所有的包
    讯享网
    卸载包

    运行命令来卸载指定的包

     

    注意:在使用了该命令卸载指定的包后,同时会删除 中的包的名字和版本号

    DevDependencies节点

    如果某些包只有在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到节点中

    讯享网

    切换npm下包镜像源

    下包的镜像源,指的就是下包的服务器地址

    默认的下包服务器地址(外国服务器,网速相对会慢一些)

     

    规范的包结构

    1. 每个包独占一个文件夹
    2. 包的顶级目录下必须包含package.json这个包管理配置文件
      image-20230930160845343
    3. package.json中必须包含name、version、main这三个属性,分别代表包的名字、版本号、入口文件。
      入口文件:导入时,以什么文件进行导入的

    发布包

    登录:在需要发布的包的父文件夹中,打开终端,输入进行登录

    发布:在需要发布的包的文件夹中,打开终端,输入

    注意:需要发布的包不能和其他人已经发布的包的名字雷同

    删除包

    在终端输入,即可删除72小时以内发布的包

    被删除的包在24小时内重新发布

    优先从缓存中加载

    模块在第一次加载后会被缓存,这也意味着多次调用不会导致模块的代码被多次执行

    注意:不论是内置模块用户自定义模块、还是第三方模块,它们都会优先从缓存这中加载,从而提高模块的加载效率

    内置模块加载机制

    内置模块的加载优先级最高

    自定义模块的加载机制

    使用加载自定义模块时,必须指定以或开头的路径标识符。在加载自定义模块时,如果没有指定的路径标识符,则node会把他当做内置模块第三方模块

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

    1. 按照确切的文件名进行加载
    2. 补全.js扩展名进行加载
    3. 补全.json扩展名进行加载
    4. 补全.node扩展名进行加载
    5. 加载失败,终端报错

    第三方的加载机制

    如果传递给的模块标识符不是一个内置模块,也没有或开头,则会从当前的模块的父目录开始,尝试从/node_modules文件中加载第三方模块。

    如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录

    例如,假设在“C:Usersitheimaprojectfoo.js”文件里调用了,则Node.js会按一下顺序查找:

    1. node_modulestools
    2. node_modulestools
    3. node_modulestools
    4. node_modulestools

    目录作为模块

    当把包的目录(文件夹名)作为标识符,传递给进行加载的时候,有三种加载方式:

    1. 被加载的目录下查找一个叫做的文件,并寻找作为加载的入口
    2. 如果目录里面没有文件,或者入口不存在或无法解析,则Node.js将会试图加载目录下的index.js文件
    3. 如果以上两步都失败了,则Node.js会在终端打印错误信息,报告模块的缺失:Error: Cannot find module ‘xxx’

    什么是Express

    官方解释:Express是基于Node.js平台,快捷、开放、极简的Web开发框架

    通俗理解:Express的作用和Node.js内置的http模块类似,是专门用来创建Web服务器的

    :就是一个npm上的第三方包,由Node.js原生http模块封装而成,提供了快速创建Web服务器的边界方法

    Express可以做什么

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

    • :专门对外提供Web网页资源的服务器
    • :专门对外提供API接口的服务器

    Express的基本使用

    安装

    在终端输入(以这个版本为例)

    创建基本的Web服务器
    讯享网
    监听GET、POST请求

    通过方法,可以监听客户端的GET请求,具体方法:

    • 请求对象,包含了与请求相关的属性与方法
    • 响应对象,包含了响应相关的属性与方法

    :

    通过方法,可以监听客户端的POST请求,具体方法:

    把内容响应给客户端

    ,将 ‘内容’ 响应给客户端,内容的数据类型不可以是,不然会报错

     
    获取URL中携带的查询参数

    通过对象,可以访问到客户端通过查询字符串的形式发送到服务器的参数

    默认是一个空对象

    如:输入URL为:

    讯享网
    获取URL中的动态参数

    通过对象,可以访问到URL中通过 匹配到的动态参数(后面跟的参数可以任意改)

    默认是一个空对象

    如:输入ULR为:

     

    托管静态资源

    托管单个资源目录

    express提供了一个非常好用的函数,叫做,通过它,我们可以非常方便地创建一个静态资源服务器

    例如:通过如下代码就可以将public目录下的图片、CSS文件、JavaScript文件对外开放了

    讯享网

    注意express在指定的静态目录中查找文件,并对外提供资源的访问路径,因此,存放静态文件的目录名不会出现在URL中

    如:
    images/bg.png
    css/style.css
    js/login.js


    托管的文件夹需要在和node_modules文件夹同级下,向内查询,如:
    image-20231212001851681

    需要托管pages文件夹,则需要从路径”综合案例“文件夹向下寻找:

     
    托管多个资源目录

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

    讯享网

    访问静态文件时,express.static()函数会根据目录的添加顺序来查找所需文件

    如:(获取public文件夹中的文件的优先级高于其他文件夹)

    • 如果publicfiles中都有,则在输入后,访问的是public中的
    • 如果只有files中有,则在输入后,访问的是files中的
    挂载路径前缀

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

     
       

    现在就可以通过带有/public前缀地址来访问public目录的文件了:





    访问服务地址,显示那个页面

    在开启了express服务后,访问服务地址,默认显示的其实是托管的静态资源文件夹下的文件,如:

    讯享网

    在访问地址时,其实访问的全部地址为。

    注意:当托管的静态资源文件夹下,没有一个叫的文件时,访问是不会显示出什么的

    这时,在地址后面,添加该托管的静态资源文件夹下的某个HTML文件,就可以显示出该HTML文件在浏览器中,如:。(abc.html为public文件夹下的一个文件)

    什么是路由

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

    express中的路由分3部分组成,,分别是:

    • method:请求的类型
    • path:请求的URL地址
    • handler:处理函数

    例子

     

    路由的匹配过程

    当每一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后,才会调用对应的处理函数

    在匹配时,会按照路由的先后顺序进行匹配,如果匹配时,的请求类型和请求的URL中的请求类型和请求的URL对应,则express会将这次请求转交给对应的 函数处理

    路由的使用

    在express中使用路由最简单的方式,就是把路由挂到创建的Web服务器上,如:

    讯享网

    模块化路由

    为了方便对路由进行模块化的管理,express将路由直接挂载到 Web服务器(app)上,推荐将路由抽离为单独的模块

    将路由抽离为单独模块的步骤如下:

    1. 创建路由对应的 文件
    2. 调用函数创建路由对象
    3. 路由对象上挂载具体的路由
    4. 使用向外共享路由对象
    5. 使用函数注册路由模块
      函数的作用,就是用来注册全局中间件

    代码实现:

    创建的路由模块

     

    使用路由模块的js

    讯享网

    为路由模块添加前缀

    类似于托管静态资源挂载前缀,路由模块添加前缀的方式同样简单:

    假设原本没加前缀时,输入就可以访问

     
        
    讯享网

    此时需要输入(中间多了一个/server)才可以访问

    什么是中间件

    中间件(Middleware),特质业务流程

    例子理解:

    在处理污水的时候,一般都要经过三个处理环节

    处理污水的这三个中间处理环节,就可以叫做

    express中间件的调用流程

    当一个请求到达express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理

    express中间件的格式

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

    • next函数是实现多个中间件连续调用的关键,它表示把流转关系交给下一个中间件路由

    其中的就是中间件函数,他的参数必须包含next。而路由处理函数只包含了req和res参数

    express中间件的使用

    客户端发送的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件

    通过调用,即可定义一个全局生效的中间件

     
    讯享网

    中间件的作用

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

    定义多个中间件

    1. 方法一
       

      image-20231004171336232

    2. 方法二
      讯享网

    中间件

    不使用定义的中间件,就叫做局部生效的中间件,它只对加入了局部中间件的路由有效

    如:

     
        
    • 当访问 时,执行结果如下图:
      image-20231004180922242
    • 当访问 时,执行结果如下图:
      image-20231004181159471
    加入多个局部中间件

    有2中方法:

    1. 讯享网
    2.  

    中间件的使用注意事项

    1. 一定要在使用之前注册中间件(app.use()注册)
    2. 客户端发送过来的请求,可以连续调用多个中间件进行处理
    3. 执行完中间件的业务代码之后,不要忘记调用next()函数
    4. 为了防止代码逻辑混乱,调用next()函数后,不要在写额外的代码
    5. 连续调用多个中间件是,多个中间件之间,共享和对象

    中间件的分类

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

    1. 应用级别的中间件
    2. 路由级别的中间件
    3. 错误级别的中间件
    4. express内置的中间件
    5. 第三方的中间件
    应用级别的中间件

    通过或或,绑定到上的中间件,叫做应用级别的中间件

    如:

    讯享网
    路由级别的中间件

    绑定到示例上的中间件,叫做路由级别的中间件,它的用法没有任何区别,只不过,应用级别中间件是绑定到app示例上,路由级别中间件绑定到router示例上

    如:

     
    错误级别的中间件

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

    格式:错误级别中间件的function处理函数中,必有4个形参,分别是

    注意:错误级别中间件必须注册在所有路由之后,否则会报错

    如:

    讯享网
    express内置的中间件

    自express的4.16.0版本开始,express内置了3个常用的中间件:

    1. :快速托管静态资源的内置中间件
    2. 解析JSON格式的请求体数据(有兼容性,尽在4.16.0+版本中可用)
    3. 解析URL-encoded格式的请求体数据(有兼容性,尽在4.16.0+版本可用)
     
    第三方的中间件

    非express官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件。

    使用步骤

    1. 运行 安装中间件
    2. 运行导入中间件
    3. 调用注册并使用中间件

    自定义中间件

    手动模拟一个类似于express.urlencoded这样的中间件,来解析POST提交到服务器器的表单数据

    实现步骤

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

    实现步骤:

    1. 创建基本的服务器
    2. 创建API路由模块
    3. 编写GET接口
    4. 编写POST接口
    5. CORS跨域跨域资源共享

    创建基本的服务器

    讯享网

    创建API路由模块

     
    讯享网

    编写GET接口

     

    编写POST接口

    讯享网

    注意:如果号获取URL-encoded格式的请求体数据,必须配置中间件:

     

    CORS跨域跨域资源共享

    接口的跨域问题

    上面编写的接口与,在一个很严重的问题:不支持跨域请求

    解决接口跨域问题的方案主要有两种:

    1. CORS(主流的解决方案,推荐使用)
    2. JSONP(有缺陷的未解决方案,只支持GET请求)
    使用CORS中间件解决跨域问题

    CORS是express的一个第三方中间件,通过安装和配置CORS中间件,可以很方便地解决跨域问题。

    使用步骤分为如下3步:

    1. 运行 安装中间件
    2. 使用导入中间件
    3. 在路由之前调用注册中间件
    什么是CORS

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

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

    image-20231208220656188

    CORS的注意事项
    1. ORS主要在服务器端进行配置。客户端浏览器无须做任何额外的配置,即可请求开启了CORS的接口。
    2. ORS在浏览器中有兼容性。只有支持XMLHttpRequestLevel2的浏览器,才能正常访问开启了CORS的服务端接(例如:IE10+、Chrome4+、FireFox3.5+)。
    CORS响应头部- Access-Control-Allow-

    响应头部中可以携带一个Access-Control-Allow-字段,其语法如下:

    其中,origin参数的值制定了允许访问该资源的外部URL。

    例如,下面的字段值将只允许来的请求

    讯享网

    如果指定了字段的值为通配符,表示允许来自任何域的请求,示例代码如下:

     
    CORS 响应头部-Access-Control-Allow-

    默认情况下,CORS支持客户端向服务器发送如下的9个请求头

    Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type (值仅限于 text/plain、multipart/form-data、application/x-www-form-urlencoded 三者之一)

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

    讯享网
    ORS响应头部-Access-Control-Allow-

    默认情况下,CORS 仅支持客户端发起 GET、POST、HEAD 请求。

    如果客户端希望通过 、 等方式请求服务器的资源,则需要在服务器端,通过来指明实际请求所允许使用的HTTP方法

     
    CORS请求的分类

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

    1. 简单请求
      同时满足以下两大条件的请求,就属于简单请求:
      • :GET、POST、HEAD 三者之一
      • 不超过以下几种字段:无自定义头部字段、Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type (只有三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)

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

    在浏览器与服务器正式通信之前,浏览器会先发送OPTION请求进行预检,以获知服务器是否允许该实际请求,所以这一次的OPTION请求称为“预检请求”。服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据。

    简单请求和预检请求的区别
    简单请求的特点:客户端与服务器之间只会发生一次请求
    预检请求的特点:客户端与服务器之间会发生两次请求,OPTION预检请求成功之后,才会发起真正的请求

    常见的数据库及分类

    市面上的数据库有很多种,最常见的数据库有如下几个:

    • (目前使用最广泛、流行度最高的开源免费数据库;Community + Enterprise)
    • Oracle数据库(收费)
    • SQLServer数据库(收费)
    • Mongodb数据库(Community + Enterprise)

    其中,MySQL、Oracle、SQLServer属于传统型数据库(又叫做:关系型数据库SQL数据库),这三者的设计理念相同,用法比较类似。

    而Mongodb属于新型数据库(又叫做:非关系型数据库或NoSQL数据库),它在一定程度上弥补了传统型数据库的缺陷。

    传统型数据库的数据组织结构

    数据的组织结构:指的就是数据以什么样的结构进行存储。

    传统型数据库的数据组织结构,与Excel中数据的组织结构比较类似。
    因此,我们可以对比着Excel来了解和学习传统型数据库的数据组织结构。

    Excel的数据组织结构

    每个Excel中,数据的组织结构分别为工作薄工作表数据行这4大部分组成。

    image-20231209125530218

    ①整个Excel叫做工作薄
    ②users和books是工作表
    ③users工作表中有3行数据
    ④每行数据由6列信息组成
    ⑤每列信息都有对应的数据类型



    传统型数据库的数据组织结构

    在传统型数据库中,数据的组织结构分为数据库(database)数据表(table)数据行(row)字段(field)这4大部分组成。

    数据库类似于Excel的工作薄
    数据表类似于Excel的工作表
    数据行类似于Excel的每一行数据
    字段类似于 Excel 的
    ⑤每个字段都有对应的数据类型



    实际开发中库、表、行、字段的关系
    1. 在实际项目开发中,一般情况下,每个项目都对应独立的数据库
    2. 不同的数据,要存储到数据库的不同表中,例如:用户数据存储到 users 表中,图书数据存储到 books表中。
    3. 每个表中具体存储哪些信息,由字段来决定,例如:我们可以为 users 表设计 id、user、name、password 这3个字段。
    4. 表中的行,代表每一条具体的数据。

    了解需要安装哪些MySQL相关的软件

    工具

    可视化的MySQL管理工具

    终端管理MySQL

    1. 默认情况下,在终端是无法直接执行命令的,会无法识别,这时需要配置环境变量
    • 接着右键点击我的电脑img
    • 再点击img
    • 点击高级系统设置img
    • 点击环境变量img
    • 在第一步中选择Path,选择编辑
      将MySQL Server 8.0文件夹下的bin文件夹添加到里面
      我的是:

    1. 在终端中输入
      讯享网

      其中,root为用户名,admin123为密码

    2. 终端中查看用户信息
       
    3. 如果在后面,node中使用mysql模块无法连接到MySQL数据库,并报错:,意为:客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端;

      报错原因
      最新的MySQL模块并未完全支持MySQL 8.0的加密方式,而MySQL 8.0中默认仍然是加密方式,因此用户认证不通过了。

      解决方案
      终端中输入:,
      如:

      然后输入:

      image-20231211110641013

    使用 Navicat 连接数据库

    1. 点击连接
    2. 选择MySQL数据库

    image-20231210155941302

    完成以上的步骤后,出现新建连接:

    image-20231210160338737
    • 连接名:随便取
    • 用户名:使用下载MySQL数据库时创建的用户名(默认为root)
    • 密码:创建用户名时的密码

    其他选项没有出现问题就可以不用更改

    创建数据库

    1. 在数据库列表中,右键选择新建组

    image-20231210161335286

    1. 然后右键新建的组,然后新建连接,选择MySQL数据库:[连接数据库](#使用 Navicat 连接数据库)

    image-20231210161542597

    1. 双击打开连接
    image-20231210161840445
    1. 右键连接,创建数据库
      • 数据库名:不要使用中文,也不要有空格
      • 字符集:选择
      • 排列规则:可以不填写
      image-20231210162124350

    创建数据表

    基本操作
    1. 打开创建的数据库,右键其中的“表”,选择新建表
    2. 设计表的字段
      image-20231210163127814
    3. Ctrl+S保存,并给表命名
    配置表的字段

    image-20231210172203538

    在这里,根据字段的类型,可以配置不同的东西

    同样可以在“索引”进行一些配置

    image-20231210172449250

    1. 输入索引名:
      image-20231210173104145
    2. 选择要添加的字段(可多选),并选择排序顺序(无所谓,二选一
      image-20231210173255958
    3. 添加索引类型:
      1. Normal(普通索引):
        • 普通索引是最常见的索引类型。
        • 它用于加速查询操作,提高查询性能
        • 允许重复值,可以在一个字段上创建多个普通索引。
      2. Unique(唯一索引):
        • 唯一索引要求索引列的值是唯一的,不允许重复值
        • 它用于保证数据的唯一性约束。
        • 唯一索引可以加速唯一性检查和查找操作。
      3. Spatial(空间索引):
        • 空间索引用于处理空间数据,如地理位置信息、二维图形等。
        • 它支持空间范围查询和最近邻查询等操作。
        • 空间索引使用特定的空间算法来加速空间数据的检索。
      4. Fulltext(全文索引):
        • 全文索引用于支持全文搜索功能。
        • 它可以在文本数据中快速搜索关键词,支持模糊搜索、分词和关键词匹配等操作。
        • 全文索引适用于文本处理和搜索引擎等应用场景。

    image-20231210173520698

    1. 添加索引方法:
      1. B树索引(B-Tree Index):
      • B树索引是一种常见的平衡树结构索引,适用于范围查询和精确查找
      • B树索引适用于传统的关系型数据库系统,如MySQL、Oracle等。
      • B树索引的特点是支持高效的插入和删除操作,能够自动平衡和调整树结构。
      1. 哈希索引(Hash Index):
      • 哈希索引使用哈希表的结构来快速查找数据,适用于等值查找
      • 哈希索引通常用于内存数据库或具有特定查询模式的场景。
      • 哈希索引的特点是查找速度快,但不支持范围查询和排序操作。

      image-20231210173700999

    什么是SQL

    SQL(英文全称:StructuredQueryLanguage)是,专门用来访问和处理数据库的编程语言。能够让我们以编程的形式,操作数据库里面的数据

    三个关键点:

    1. SQL是一门数据库编程语言
    2. 使用SQL语言编写出来的代码,叫做SQL语句
    3. SQL语言只能在关系型数据库中使用(例如MySQL、Oracle、SQLServer)。非关系型数据库(例如Mongodb)不支持SQL语言

    SQL能做什么

    • 从数据库中查询数据
    • 向数据库中插入新的数据
    • 更新数据库中的数据
    • 从数据库删除数据
    • 可以创建新数据库
    • 可在数据库中创建新表
    • 可在数据库中创建存储过程、视图

    SQL的学习目标

    重点掌握如何使用SQL从数据表中:

    • 查询数据()
    • 插入数据()
    • 更新数据()
    • 删除数据()

    额外需要掌握的4种SQL语法:

    • 、、运算符
    • 条件
    • 排序
    • 函数

    SQL的AND、OR、NOT运算符

    AND、OR可以在WHERE子句中,把两个或多个条件结合起来

    NOT条件取反

    • AND表示必须同时满足多个条件,相当于 与运算符,例如:
    • OR表示只要满足任意一个条件即可,相当于 || 或运算符,例如:
    • NOT表示条件取反,如:(筛选 的列)

    SQL的子句

    子句用于限定选择的标准,在、、语句中,亦可使用子句来限定选择的标准

    可在子句中使用的运算符

    下面的运算符可以在WHERE字居中使用,用来限定选择的标准

    运算符 描述 = 等于 <> 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于 BETWEEN AND 在某个范围内 LIKE 搜索某种模式 IN 指定针对某个列的多个可能值

    注意:在某些版本中的 SQL中,操作符可以写为

    between and

    讯享网

    In

     

    查询 SAL 列中等于 5000,3000,1500 的值。

    like

    讯享网

    表中 Ename 列中有 M 的值,M 为要查询内容中的模糊信息。

    • % 表示多个字值,_ 下划线表示一个字符;
    • M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
    • %M% : 表示查询包含M的所有内容。
    • %M_ : 表示查询以M在倒数第二位的所有内容。

    SQL的子句

    语句用于对结果集进行排序

    语句默认按照升序进行排序

    • 关键字代表升序排序
    • 关键字代表降序排列

    例:

     

    ORDER BY 子句-

    users表中的数据,先按照status字段进行降序排列,在按照username的字母数顺序进行升序排列

    讯享网

    SQL的函数

    函数用于返回查询结果的总数据条数,语法格式如下:

     
         

    使用 AS 为设置

    讯享网

    例子:

     image-20231211084538718 

    SQL的语句(查)

    语句用于从表中查询数据。执行的结果被存储在一个结果表中(称为结果集)。语法格式如下:

    讯享网

    注意

    • SQL语句中的关键字对大小写不敏感。SELECT等效于select,FROM等效于from。
    • 每一行的结束,需要加上分号,以防报错。
    • 字符串需要使用引号或
    • 【表】名,或【列】名可以使用 `` 符号括起来,也可以不使用
       

    例:

    讯享网

    SQL的语句(增)

    语句用于向数据表中插入新的数据行,语法格式如下:

     
          

    例:

    讯享网

    SQL的语句(改)

    Update语句用于修改表中的数据,语法格式如下:

     
          

    例:

    讯享网

    SQL的语句(删)

    语句用于删除表中的行,语法格式如下:

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

    image-20231211092041954

    安装与配置mysql模块

    安装

    mysql模块时托管于npm上的第三方模块,它提供了在Node.js项目中连接MySQL数据库的能力。

    想要在项目中使用它,需要先运行如下命令,将mysql安装为项目的依赖包:

    讯享网
    配置mysql模块

    在使用mysql模块操作MySQL数据库之前,必须先对mysql模块进行必要的配置,主要的配置步骤如下:

     
    测试mysql模块能否正常工作

    调用db.queryO函数,指定要执行的SQL语句,通过回调函数拿到执行的结果:

    讯享网

    使用mysql模块操作MySQL数据库

    查询数据

    查询users表中所有的数据:

     
    插入数据

    向users表中插入数据:

    讯享网

    插入数据的便捷方式

    向表中新增数据时,如果数据对象的每个属性数据表的字段,则可以通过如下方式快速插入数据:

     
    更新数据
    讯享网

    更新数据的边界方式

    更新表数据时,如果数据对象的每个属性数据表的字段,则可以通过如下方式快速更新数据表数据:

     
    删除数据

    在删除时,推荐根据id这样的唯一表示,来删除对应的数据:

    讯享网

    标记删除
    使用 语句,会真正的把数据从表中删除。为了保险起见,推荐使用标记删除的形式,来模拟删除的动作

    所谓的标记删除,就是在表中设置类似于这样的,来标记当前这条数据是否被删除。

    当用户执行了删除的动作是,我们并没有执行 语句把数据删除,而是执行了语句,将这条数据对应的标记为删除即可。

     

    对用户密码进行加密

    为了保证密码的安全性,不建议在数据库中,以明文的形式保存用户密码,推荐对密码进行加密储存

    可以使用 包,对用户密码进行加密,其优点:

    • 加密后的密码,无法被你想激活成功教程。
    • 同一明文密码经过加密,得到的加密结果不相同,如:张三、李四的密码相同,但是经过加密后,得到的加密结果是不想同的。

    使用步骤:

    1. 安装
    2. 导入
    3. hashSync()函数得到加密字符串
    安装

    在终端中,输入如下代码安装:

    讯享网
    导入
     
           
    加密

    使用

    轮数越多,则生成的哈希值越复杂,也越难以被激活成功教程,通常建议轮数设置在 10 到 12 之间

    讯享网

    优化表单数据验证

    表单验证的原则:前端验证为辅,后端验证为主,后端永远不要相信前端提交过来的任何内容

    在实际开发中,前后端都需要对表单的数据进行合法性的验证,而且,后端做为数据合法性验证的最后一个关口,在拦截非法数据方面,起到了至关重要的作用。

    单纯的使用的形式对数据合法性进行验证,效率低下、出错率高、维护性差。因此,推荐使用第三方数据验证模块,来降低出错率、提高验证的效率与可维护性,让后续程序员把更多的精力放在核心业务逻辑的处理上,

    1. 安装包,为表单中携带的每个数据项,定义验证规则:
       
    2. 安装中间件,来实现自动对表单数据进行验证的功能:
      讯享网
    3. 新建用户信息验证规则模块:user.js,:
       

    Web开发模式

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

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

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

    优点

    • 。因为服务器端负责动态生成HTML内容,浏览器只需要直接渲染页面即可。尤其是移动端,更省电。
    • 。SEO 是搜索引擎优化(Search Engine Optimization)的缩写。它是一种通过优化网站内容和结构,以提高网站在搜索引擎中的排名和可见性的技术和策略。因为服务端响应的是完整的HTML页面内容,所以爬虫更容易爬取获得信息,更有利于SEO

    缺点:

    • 。即服务器完成HTML页面内容的拼接,如果请求较多,会对服务器造成一定的访问压力
    • 。使用服务端渲染,则无法进行分工合作,尤其对前端复杂度高的项目,不利于项目高效开发。
    前后端分离

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

    优点:

    • 。前端专注于UI页面的开发,后端专注于api的开发,且前端有更多的选择性。
    • 。Ajax技术的广泛应用,极大的提高了用户的体验,可以轻松实现页面的局部刷新。
    • 。因为页面最终是在每个用户的浏览器中生成的。

    缺点:

    • 。因为完整的HTML页面需要在客户端动态拼接完成,所以爬虫对无法爬取页面的有效信息。(解决方
      :利用Vue、React等前端框架的(serversiderender)技术能够很好的解决SEO问题!)

    如何选择Web开发模式

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

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

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

    身份认证

    ,又称身份验证鉴权,是指通过一定的手段,完成对用户身份的确认

    身份认证的目的,是为了确认当前所声称为某种身份的用户,确定是所声称的用户。如:你去找快递员取快递,你要真么证明这份快递是你的。

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

    • 推荐使用
    • 推荐使用

    HTTP协议的无状态性

    了解HTTP协议的无状态性是进一步学习Session认证机制的必要前提。

    ,指的是客户端的每次HTTP请求都是独立的,连续多个请求之间没有直接的关系,服务器不会主动保留每次HTTP请求的状态

    如何突破HTTP无状态的限制

    对于超市来说,为了方便收银员在进行结算时给VIP用户打折,超市可以为每个VIP用户发放会员卡。

    image-20231211212326657

    上面例子中的会员卡,就是身份认证的标识,在Web开发中的专业术语叫做,这个是储存在客户端的,每次访问服务器的时候,会从客户端寻找并校验

    什么是Cookie

    存储在用户浏览器中的一段不超过4KB的字符串。它由一个名称(Name)、一个(Value)和其它几个用于控制Cookie有效期安全性使用范围的组成。

    image-20231211213140700

    不同域名下的Cookie各自独立,每当客户端发起请求时,会自动当前域名下所有未过期的一同发送到服务器。

    Cookie的几大特性:

    • 自动发送
    • 域名独立
    • 过期时限
    • 4KB限制

    Cookie在身份认证中的作用

    客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的,客户端会自动将 Cookie 保存在浏览器中

    随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。

    image-20231211213840510

    请求头中的Cookie

    image-20231211214347636

    Cookie不具有安全性

    由于Cookie是存储在浏览器中的,而且浏览器也提供了读写的,因此和容易被伪造,不具有安全性。

    因此,不建议服务器将重要的隐私数据,通过Cookie的形式发送给浏览器。

    image-20231211215119027

    注意千万不要使用Cookie储存重要且隐私的数据!比如用户的身份信息、密码等。

    提高身份认证的安全性

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

    image-20231211215710295

    会员卡:相当于Cookie验证

    刷卡认证:相当于服务器验证

    这种“会员卡+刷卡认证”的设计理念,就是Session认证机制的精髓。

    Session的工作原理

    image-20231211221952200

    安装express-session中间件

    在express项目中,只需要安装express-session中间件,即可在项目中使用Session认证:

    讯享网

    配置express-session中间件

    中间件安装成功后,需要铜鼓欧来注册中间件:

     
           

    向session中存数据

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

    讯享网

    从session中取数据

    可以直接从对象上获取之前存储的数据:

     
           

    清空session

    调用 函数,即可清空服务器保存的session信息:

    讯享网

    了解Session认证的局限性

    在实际应用中,由于安全和隔离的考虑,前端和后端的代码通常会被部署在不同的服务器上。这样,前端代码就无法直接访问后端代码,因为它们不在同一个域名或 IP 地址下。

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

    注意

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

    什么是JWT

    JWT(英文全称:JSON Web Token) 是目前最流行的跨域认证解决方案

    JWT的工作原理

    image-20231212212553431

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

    JWT的组成部分

    JWT通常头三部分组成,分别是(头部)、(有效荷载)、(签名)

    三者之间使用英文的“”分割,格式如下:

     
           

    下面是JWT字符串的示例:

    讯享网

    JWT的三个部分分别代表的含义

    • 真正的用户信息,它是用户信息经过加密之后生成的字符串
    • 、:是安全性相关的部分,只是为了保证的安全性

    JWT的使用方式

    客户端收到服务器返回的JWT之后,通常会将它储存在或中。

    此后,客户端每次与服务器通信,都要带上这个JWT的字符串,从而进行身份认证。推荐的做法是把JWT放在HTTP请求头的Authorization字段中,格式如下:

     
           

    安装JWT相关的包

    运行如下命令,安装两个JWT相关的包:

    讯享网

    两个包的作用:

    • :用于生成JWT字符串
    • :用于将JWT字符串解析还原成JSON对象

    导入JWT相关的包

    使用require()的函数,分别导入JWT相关的两个包:

    注意:通过 获取到的是一个对象,因此可以使用解构,将这个对象中的取出

     
           

    定义secret秘钥

    为了保证 字符串的安全性,防止 字符串在网络传输过程中被别人激活成功教程,我们需要专门定义一个用于加密解密的:

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

    secret秘钥的本质就是一个字符串

    讯享网

    登录成功后JWT字符串

    调用包提供的方法,将用户的信息加密成JWT字符串,响应给客户端:

     
           

    将JWT字符串为JSON对象

    客户端每次在访问那些有权限接口的时候,都需要主动通过请求头中的 字段,将 Token 字符串发送到服务器进行身份验证

    此时,服务器可以通过这个中间件,自动将客户端发送过来的Token解析还原成JSON对象

    讯享网

    使用req.auth获取用户信息

    当这个中间件配置成功后,就可以把解析出来的用户信息,挂载到属性上面,即可在那些有权限的接口中,使用对象,来访问从 JWT 字符串中解析出来的用户信息了,示例代码如下:

     
           

    测试

    image-20231218153653231

    image-20231218153529520

    捕获解析JWT失败后产生的错误

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

    讯享网

    认证

    注意

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

    什么是JWT

    JWT(英文全称:JSON Web Token) 是目前最流行的跨域认证解决方案

    JWT的工作原理

    [外链图片转存中…(img-F1T9f52C-57)]

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

    JWT的组成部分

    JWT通常头三部分组成,分别是(头部)、(有效荷载)、(签名)

    三者之间使用英文的“”分割,格式如下:

     
           

    下面是JWT字符串的示例:

    讯享网

    JWT的三个部分分别代表的含义

    • 真正的用户信息,它是用户信息经过加密之后生成的字符串
    • 、:是安全性相关的部分,只是为了保证的安全性

    JWT的使用方式

    客户端收到服务器返回的JWT之后,通常会将它储存在或中。

    此后,客户端每次与服务器通信,都要带上这个JWT的字符串,从而进行身份认证。推荐的做法是把JWT放在HTTP请求头的Authorization字段中,格式如下:

     
           

    安装JWT相关的包

    运行如下命令,安装两个JWT相关的包:

    讯享网

    两个包的作用:

    • :用于生成JWT字符串
    • :用于将JWT字符串解析还原成JSON对象

    导入JWT相关的包

    使用require()的函数,分别导入JWT相关的两个包:

    注意:通过 获取到的是一个对象,因此可以使用解构,将这个对象中的取出

     
           

    定义secret秘钥

    为了保证 字符串的安全性,防止 字符串在网络传输过程中被别人激活成功教程,我们需要专门定义一个用于加密解密的:

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

    secret秘钥的本质就是一个字符串

    讯享网

    登录成功后JWT字符串

    调用包提供的方法,将用户的信息加密成JWT字符串,响应给客户端:

     
           

    将JWT字符串为JSON对象

    客户端每次在访问那些有权限接口的时候,都需要主动通过请求头中的 字段,将 Token 字符串发送到服务器进行身份验证

    此时,服务器可以通过这个中间件,自动将客户端发送过来的Token解析还原成JSON对象

    讯享网

    使用req.auth获取用户信息

    当这个中间件配置成功后,就可以把解析出来的用户信息,挂载到属性上面,即可在那些有权限的接口中,使用对象,来访问从 JWT 字符串中解析出来的用户信息了,示例代码如下:

     
           

    测试

    [外链图片转存中…(img-JIZp475W-57)]

    [外链图片转存中…(img-UceHSg8f-57)]

    捕获解析JWT失败后产生的错误

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

    讯享网


    小讯
    上一篇 2025-04-15 14:13
    下一篇 2025-04-27 11:13

    相关推荐

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
    如需转载请保留出处:https://51itzy.com/kjqy/206057.html