Node.js
快捷键
在window的powershell或者cmd终端中
- 使用 ↑ 可以快速定位到上一次执行的命令
- 使用tab 能够快速补全路径
- 使用esc 能够快速清空当前已输入的命令
- 输入cls 命令 可以清空终端
fs文件系统模块
1.fs模块是node官方提供的、用来操作文件的模块 它提供了一系列的方法和属性 用来满足用户需求
例如:
- fs.readFile()方法 用来读文件内容
- fs.readFile()方法,用来写文件内容
如何导入?
const fs = require('fs')
__dirname 表示当前文件所处的目录
path路径模块
它是用来处理路径的模块 它提供了一系列的方法和属性 用来满足用户对路径的处理需求
- path.join() 用来将多个路径片段拼接成一个完整的路径字符串
- path.basename()方法 用来从路径字符串中 将文件名解析出来
还是先导入
const path = require('path')
http模块
客户端和服务器的概念
在网络节点中 负责消费资源的电脑叫做 客户端
负责对外提供网络资源的电脑叫做服务器
http模块是用来创建web服务器的模块 通过http模块提供的http.createServer()方法 就能创建一台web服务器 从而对外提供web资源服务
http模块的作用
在node.js中 我们不需要第三方web服务器软件 因为我们可以基于node.js提供的http模块 通过几行简单的代码 就能轻松的手写一个服务器软件 从来对外提供web服务
服务器相关概念
IP地址
ip地址就是互联网上每台计算机的唯一地址 只有在知道对方ip地址的前提下 才能与对应的电脑之间进行数据通信
ip地址的格式:通常用"点分十进制"表示成(a.b.c.d)的形式 其中abcd表示0-255之间的数字
注意:
- 互联网上每台web服务器,都有自己的ip地址
- 开发期间 自己的电脑即是一台服务器 也是一个客户端 为了方便测试 可以在自己浏览器上输入127.0.0.1 就能把自己的电脑当作一台服务器进行访问了
域名和域名服务器
域名是ip地址的别名 方便人们记忆
ip地址和域名是一一对应的关系 这种对应关系被存放到一种叫做域名服务器的电脑中
访问域名时 DNS将域名转换为ip地址 在进行访问
开发期间 127.0.0.1对应的域名是localhost 都代表了本机
端口号
每台电脑对应一个id 但是每台电脑可以产生多个web服务 所以一个端口号对应一个web服务
通过端口号 可以准确的交给对应的web服务进行处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRe4qrzX-1655303053957)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220606135626784.png)]
注意:
- 每个端口号不能同时被多个web服务占用
- 在实际应用中 URL中的80端口可以被忽略
创建web服务器的基本步骤
- 导入http模块
- 创建web服务器实例
- 为服务器实例绑定request事件 监听客户端的请求
- 启动服务器
req
只要服务器接收到来自客户端的请求 就会调用server.on()为服务器绑定的request事件处理函数
如果想在事件处理函数中 访问和客户端相关的数据和属性 可以使用req
模块化
分为内置模块(fs.path.http) 自定义模块(js文件) 第三方模块 需要手动安装
调用require时 会自动执行模块中的代码
加载模块就是调用require
module对象
每个自定义模块中都有一个module对象 它里面存储了和当前模块有关的信息
module.exports对象
在自定义模块中可以使用module.exports对象来 将模块中的成员共享出去 供外界使用
外界用require()方法导入自定义模块时 得到的就是module.exports 所指向的对象
共享对象时的注意点
使用require()方法导入模块时 导入的结果 永远以module.exports指向的对象为准
exports === module.exports
两者使用误区
时刻谨记,require()模块时 得到的永远都是module.exports指向的对象
模块化规范
Node遵循了CommonJS模块化规范 CommonJS规定了模块的特性和各模块之间如何相互依赖
CommonJS规定:
- 每个模块内部 module变量代表当前模块
- module变量是一个对象 它的exports属性(即module.exports)是对外的接口
- 加载某个模块 其实是加载该模块的module.exports 属性 require()用来加载模块
.
Express
Express是基于node平台 快速、开放、极简的web开发框架
通俗的说 Express的作用和node.js内置的http模块类似 是专门用来创建web服务器的
Express的本质 就是一个npm的第三方包 提供了快速创建web服务器的便捷方法
Express能做什么?
对于前端程序员来说 最常见的两种服务器 分别是
- web网站服务器 专门对外提供web网页资源的服务器
- api接口服务器 专门对外提供api接口的服务器
使用Express 我们可以方便、快速的创建web网站服务器或者API接口的服务器
express.static()
express 提供了一个非常好用的函数 叫做express.static(),通过它 我们可以非常方便地创建一个静态资源服务器 例如 通过如下代码就可以将public目录下的图片 css文件
JS文件对外开放访问了
app.use(express.static('public'))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w4S7pce8-1655303053958)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220607135803253.png)]
注意:Express 在指定的静态目录中查找文件 并对外提供资源的访问路径
因此 存放静态文件的目录名不会出现在URL中
如果要托管多个静态资源目录 多次调用express.static()
访问静态资源文件时 express.static()函数会根据目录的添加顺序查找所需的文件
挂在路径前缀
如果希望在托管的静态资源访问路径之前 挂在路径前缀 则可以使用如下的方式
app.use('puublic(可以任意添加)',express.static('public'))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLlSb3UL-1655303053958)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220607143522880.png)]
Express路由
在Express中 路由指的是客户端的请求与服务器处理函数之间的映射关系
Express中的路由分三部分组成 分别为请求的类型、请求的url地址、处理函数 格式如下
app.method(path,handler)
// 匹配GET请求 且请求url为 /
app.get('/',function(req,res){
res.send('Hello World!')
})
// 匹配POST请求 且请求url为 /
app.post('/',function(req,res){
res.send('Got a POST request!')
})
路由匹配过程
每当一个请求到达服务器后 需要先经过路由的匹配 只有匹配成功之后 才会调用对应的处理函数
路由匹配注意点:
- 按照定义的先后顺序进行匹配 在前面匹配的优先级高
- 请求类型和请求的url同时匹配成功 才会调用对应的处理函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c1zSPxDH-1655303053959)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220607150626470.png)]
中间件
中间件 特指业务流程的中间处理环节
Express 中间件的调用流程
当一个请求到达Express的服务器之后 可以连续调用多个中间件 从而对这次请求进行预处理
Express中间件的格式
Express的中间件 本质上就是一个function处理函数 Express中间件的格式如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afRUE27L-1655303053960)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220607160408629.png)]
next函数的作用
next函数是实现多个中间件连续调用的关键 它表示把流转关系转交给下一个中间件或路由
中间件的作用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FyIL4FeQ-1655303053962)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220607203559896.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PvJTopl-1655303053963)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220607204229492.png)]
局部生效的中间件
不适用app.use()定义的中间件 叫做局部生效的中间件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O1KKuedE-1655303053964)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220607210033929.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhGEOzn7-1655303053965)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220607210220478.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b5jOsVMj-1655303053965)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220608092106901.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S7qZ9bXP-1655303053966)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220608094323176.png)]
CORS跨域资源共享
1.接口的跨域问题
解决接口跨域问题的方案主要有两种:
- CORS(主流的解决方案:推荐使用)
- JSONP(有缺陷的解决方案:只支持GET请求)
使用cors中间件解决跨域问题
cors是express的一个第三方中间件 通过安装和配置cors 可以很方便的解决跨域问题
使用步骤:
- 运行npm install cors 安装中间件
- 使用const cors = require(‘cors’) 导入中间件
- 在路由之前调用app.use(cors()) 配置中间件
什么是CORS?
CORS(跨域资源共享) 由一系列HTTP响应头组成 这些HTTP响应头决定浏览器是否组织前端JS代码跨域获取资源
浏览器的同源安全策略默认会组织网页“跨域”获取资源 但如果接口服务器配置了CORS相关的HTTP响应头 就可以解除浏览器端的跨域访问限制
CORS的注意事项
- CORS主要在服务器端进行配置 客户端浏览器无需做任何额外的配置 即可请求开启了cors的接口
- cors在库伊喀巴曲中有兼容性 只有支持XHR level2 的浏览器 才能正常访问开启了CORS的服务端接口
数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CJki1JbU-1655303053967)(C:\Users\命与超然\AppData\Roaming\Typora\typora-user-images\image-20220608212944060.png)]
使用const cors = require(‘cors’) 导入中间件
3. 在路由之前调用app.use(cors()) 配置中间件
什么是CORS?
CORS(跨域资源共享) 由一系列HTTP响应头组成 这些HTTP响应头决定浏览器是否组织前端JS代码跨域获取资源
浏览器的同源安全策略默认会组织网页“跨域”获取资源 但如果接口服务器配置了CORS相关的HTTP响应头 就可以解除浏览器端的跨域访问限制
CORS的注意事项
- CORS主要在服务器端进行配置 客户端浏览器无需做任何额外的配置 即可请求开启了cors的接口
- cors在库伊喀巴曲中有兼容性 只有支持XHR level2 的浏览器 才能正常访问开启了CORS的服务端接口
数据库
[外链图片转存中…(img-CJki1JbU-1655303053967)]