Node.js(二)模块化 Express

本文详细介绍了Node.js中的模块化概念和规范,包括内置、自定义和第三方模块的分类及加载机制。接着,讨论了npm包管理,包括包的下载、分类和发布。深入探讨了Express框架,包括基本使用、路由和中间件。最后,讲解了使用Express编写接口时的CORS跨域资源共享和JSONP机制。
摘要由CSDN通过智能技术生成

目录

一、模块化的概念

1.1 什么是模块化

1.2 模块化规范

二、Node.js 中模块的分类

2.1 Node.js中模块的分类

2.2 加载模块

2.3 Node.js中的模块作用域

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

2.5 Node.js中的模块化规范

三、npm与包

3.1 包

3.2 包管理配置文件

3.3 解决下包速度慢的问题 

 3.4 包的分类

 3.5 规范的包结构

3.6 开发属于自己的包

3.8 发布包

四、模块的加载机制

4.1 优先从缓存中加载

4.2 内置模块的加载机制

4.3 自定义模块的加载机制

 4.4 第三方模块的加载机制

4.5 目录作为模块

五、初识Express

5.1 Express简介

5.2 Express的基本使用

 5.3 托管静态资源

5.4 nodemon

六、Express路由

6.1 路由的概念

 6.2 路由的使用

七、Express中间件

7.1 中间件的概念

7.2 Express中间件的基本使用

7.3 中间件的分类

7.4 自定义中间件

八、使用Express写接口

8.1 创建基本的服务器

8.2 创建API路由模块

8.3 编写GET接口

8.4 编写POST接口

8.5 CORS跨域资源共享

8.6 JSONP接口


一、模块化的概念

1.1 什么是模块化

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

1.2 模块化规范

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

好处:大家都遵守同样的规范,极大方便了各个模块之间的相互调用

二、Node.js 中模块的分类

2.1 Node.js中模块的分类

1、内置模块(内置模块是由Node.js官方提供的,例如fs、path、http等)

2、自定义模块(用户创建的每个.js文件

3、第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户自定义模块,使用前需要下载

2.2 加载模块

使用require()方法,加载内置模块,自定义模块,第三方模块

 加载自定义模块期间,可以省略.js后缀名

2.3 Node.js中的模块作用域

1、什么是模块作用域

在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问,就叫做模块作用域

2、好处

防止全局变量污染的问题

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

1、module对象

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

 2、module.exports对象

在自定义模块中,可以使用module.exports对象,将模块中的成员共享出去,供外界使用

3、向外共享成员时的注意点

使用require()方法导入模块时,导入的结果永远以module.exports指向的对象为准

4、exports对象

默认情况下,exports和module.exports指向的是同一个对象,但最终结果还是以module.exports为准

5、使用误区

2.5 Node.js中的模块化规范

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

三、npm与包

3.1 包

1、什么是包

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

2、包的来源

第三方个人或团队开发出来,免费使用的

3、为什么需要包

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

4、从哪里下载包

http://www.npmjs.com/网站上搜索自己所需要的包

https://registry.npmjs.org/下载需要的包

3.2 包管理配置文件

在项目根目录中,有一个叫做package.json的包管理配置文件,用来记录与项目有关的一些配置信息

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

在项目根目录中,创建一个叫做package.json的配置文件,即可用来记录项目中安装了那些包。

一定要把node_modules文件夹,添加到.gitignore忽略文件中

2、安装包

npm i 要安装的包名

3、一次性安装所有的包

npm install 

安装dependencies里面所有的依赖包

4、devDependencies节点

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

3.3 解决下包速度慢的问题 

1、淘宝NPM服务器

2、切换npm的下包镜像源

在cmd中执行

 3、nrm

这个工具帮助快速查看和切换下包的镜像源

 3.4 包的分类

1、项目包

被安装到项目的node_modules目录中的包,都是项目包

项目包分为:

开发依赖包:被记录到devDependencies节点中的包,只会在开发期间使用

核心依赖包:被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到

2、全局包

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

注意:

(1)只有工具性质的包 ,才有全局安装的必要性,因为它们提供了好用的终端命令

(2)判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可

3、i5ting_toc

i5ting_toc是一个可以把md文档转为html页面的小工具,使用步骤如下

 3.5 规范的包结构

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

(1)包必须以单独的目录而存在

(2)包的顶级目录下要必须包含package.json这个包管理配置文件

(3)package.json中必须包含name,version,main这三个属性,分别代表包的名字、版本号、包的入口

3.6 开发属于自己的包

1、需要实现的功能

(1)格式化日期

(2)转义HTML中的特殊字符

(3)还原HTML中的特殊字符

2、初始化包的基本结构

3、初始化package.json

 4、在index.js中定义格式化时间的方法

5、在index.js中定义 转义HTML的方法

 6、在index.js中定义还原HTML的方法

 7、将不同的功能进行模块化的拆分

8、编写包的说明文档

编写README.md文档

3.8 发布包

1、注册npm账号

2、把包发布到npm上 

3、删除发布的包

四、模块的加载机制

4.1 优先从缓存中加载

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

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

4.2 内置模块的加载机制

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

内置模块与其他模块同名,优先加载内置模块

4.3 自定义模块的加载机制

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

 4.4 第三方模块的加载机制

4.5 目录作为模块

当把目录作为模块标识符,传递给require()进行加载的时候,有三种加载方式:

五、初识Express

5.1 Express简介

1、什么是Express

Express是基于Node.js平台,快速、开放、极简的Web开发框架

与内置模块http相似,专门用来创建web服务器

本质:就是一个npm上的第三方包,提供了创建Web服务器的便捷方法

2、Express可以做什么

可以方便快速地创建Web网站的服务器或API接口的服务器

5.2 Express的基本使用

1、创建最基本的Web服务器

 2、监听GET请求

3、监听POST请求

4、把内容响应给客户端

5、获取URL中携带的查询参数

6、获取URL的动态参数

 5.3 托管静态资源

1、express.static()

可以非常方便地创建一个静态资源服务器

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

2、挂载路径前缀

5.4 nodemon

1、为什么要使用nodemon

在编写调试Node.js项目的时候,如果修改了项目的代码,则需要频繁的手动close,然后再重新启动,非常繁琐。

nodemon工具可以监听项目文件的变动,当代码被修改后,nodemon会自动帮我们重启项目

六、Express路由

6.1 路由的概念

路由就是映射关系

1、Express中的路由

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

分为三部分组成:请求的类型、请求的URL地址、处理函数

 2、Express中路由的例子

3、路由的匹配过程

 6.2 路由的使用

1、最简单的用法

把路由挂载到app上,示例代码如下:

2、模块化路由

将路由抽离为单独的模块

3、创建路由模块

 4、注册路由模块

注意:app.use()的作用就是来注册全局中间件

5、为路由模块添加前缀

七、Express中间件

7.1 中间件的概念

1、什么是中间件

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

2、Express中间件的调用流程

3、Express中间件的格式

本质上就是一个function处理函数,格式如下:

4、next函数的作用

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

7.2 Express中间件的基本使用

1、定义中间件函数

 2、全局生效的中间件

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

通过调用app.use(中间件函数),即可定义一个全局生效的中间件

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

 

4、中间件的作用

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

5、局部生效的中间件

6、定义多个局部中间件

 7、中间件的五个使用注意事项

7.3 中间件的分类

1、应用级别的中间件

 2、路由级别的中间件

 绑定到Express.Router()实例上的中间件,叫做路由级别的中间件。

3、错误级别的中间件

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

必须在路由之后

 4、Express内置的中间件

(1)express.static:快速托管静态资源的内置中间件(无兼容性)。

(2)express.json:解析JSON格式的请求体数据(有兼容性,仅在4.16.0+版本中使用)

(3)express.urlencoded:解析URL-encoded格式的请求体数据(有兼容性)

5、第三方的中间件

由第三方开发出来的中间件

使用步骤:

Express内置的express.urlencoded就是基于body-parser进一步封装出来的

7.4 自定义中间件

1、需求描述与实现步骤

 2、 定义中间件

3、监听req的data事件

4、监听req的end事件

5、使用querystring模块解析请求体数据

6、将解析出来的数据对象挂载为req.body

7、将自定义中间件封装为模块

八、使用Express写接口

8.1 创建基本的服务器

8.2 创建API路由模块

 

8.3 编写GET接口

 

8.4 编写POST接口

8.5 CORS跨域资源共享

1、接口的跨域问题

2、使用cors中间件解决跨域问题

3、什么是CORS

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

 4、CORS的注意事项

5、CORS响应头部-Access-Control-Allow-Origin

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

其中,origin参数的值指定了允许访问该资源的外域URL 

*是通配符,表示允许来自任何域的请求

6、 CORS响应头部-Access-Control-Allow-Headers

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

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

7、 CORS响应头部-Access-Control-Allow-Methods

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

如果要发起PUT、Delete等请求,则需要在服务器端通过Access-Control-Allow-Methods来指明实际请求所允许使用的HTTP方法

示例代码:

8、CORS请求的 分类

根据请求方式和请求头的不同,将CORS的请求分为两大类:

(1)简单请求

(2)预检请求

9、简单请求

(1)请求方式:GET、POST、HEAD三者之一

(2)HEAD头部信息不超过以下几种字段:

10、预检请求

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

11、简单请求和预检请求之间的区别

简单请求的特点:客户端与服务器之间只会发生一次请求

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

8.6 JSONP接口

1、JSONP的概念与特点

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

特点:

(1)JSONP不属于真正的ajax请求,因为它没有使用XMLHttpRequest这个对象

(2)JSONP仅支持GET请求,不支持POST、PUT、DELETE请求

2、创建JSONP接口的相关事项

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

3、实现JSONP接口的步骤

 

4、实现JSONP接口的具体代码

 

5、在网页中使用jQuery发起JSONP请求

  

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值