01-nodeJs高级 / path.join&path.reslove

HTTP——协议

HTTP 1.0 RFC-1945
HTTP 1.1 RFC-2616 持久连接
HTTPS RFC-2818 安全协议
HTTP 2.0 RFC-7540 加密、头部压缩、服务器推送、管线操作、多路复用

状态码:
1xx 信息
2xx 成功
3xx 重定向
4xx 请求错误
5xx 服务器错误

bower——前端包管理
npm i bower -g
bower i xxx

系统包:
1.assert-断言 

  为了提升系统的质量,需要对各种各样的东西做很严格的测试,比如在函数里面需要对参数进行校验,在接口里面可能需要对前端发回来的数据进行校验。断言通俗的讲,就是符合你的要求,这事就过去了。如果不符合要求,这程序就挂掉了。不要再往下执行了。这样做的目的就是为了给你留下一个完整的现场,告诉你在这行,出错了。 

比如一个相对庞大的模块,这个模块里有一个相对庞大的函数,这个函数比如分好几个阶段,assert可以放在这个函数每个阶段的中间放几个,以确保能确保定位哪通过,哪有报错。还可以在函数传进去的参数进行断言,确保传进来的参数是对的。

断言在发布阶段就会自动消失了。

相当于js打的断点,和php的die

2.path-路径

path.resolve() :解释,可以帮你把一堆的路径解析成单一的地址

比如:

console.log(path.resolve('/root/a/b', '../c', 'build', '..', 'strict'));
输出:   /root/a/c/strict
path.join和path.resolve的区别:

1、join是把各个path片段连接在一起, resolve把‘/’当成根目录

path.join('/a', '/b') // Outputs '/a/b'
path.resolve('/a', '/b') // Outputs '/b'

2、join直接拼接字段,resolve解析路径(绝对路径)并返回

path.join("a", "b1", "..", "b2")

console打印会得到"a/b2"

path.resolve("a", "b1", "..", "b2")

console打印得到"/home/myself/node/a/b2"

3.url-网址

4.querystring-请求数据

5.net - 网络通信模块

在你的数据走的不是http协议,会用到它。比如说有的时候为了增加数据的传输效率,咱们会选择抛弃http协议,http协议全称超文本标记语言,超文本还是文本,只是用文本的形式去传输二进制数据:第一这个时候会增加很多的无效数据量,因为需要把其变成字符进行传输,第二还要反过来进行解析降低效率。这个时候我们就想能不能直接传输二进制数据,普通的文本是搞不定的,我们需要用net模块,他是http的爸爸。

OSI七层参考模型
物理层 > 数据链路层 > 网络层(IP) > 传输层(TCP) > 会话层 > 表现层 > 应用层(HTTP)

物理层: 电压多高,材质是什么,外面要套什么保护套

数据链路层:内网链路信息,手机,电脑和路由器之间走的链路层,内网之内

网络层:外网之间通讯,你的计算机和我的计算机通讯。

传输层:保证传输质量,既能帮你纠错,也能帮助重传和传输顺序。

会话层:两台计算机互相保留基本的通讯信息,这样可以认出对方来。

表现层:为了屏蔽各个网络之间的不同,让所有网络在这个表现层上是一样的。屏蔽底层的不一致。

应用层:http,请求头代表什么呀,比如你给我发404代表什么呀,就是具体应用的东西了。

真正进入到我们互联网的世界,其实只有五层:

5层模型
物理层 > 数据链路层 > 网络层(IP) > 传输层(TCP) > 应用层(HTTP)

相当于在应用层里面把会话层和表现层和应用层把三个合为一个了。

net模块处于传输层,说直白一点,net模块就是TCP协议的实现,所以net是可以保证通讯质量的实现。

TCP: 有质量,但速度会慢,有时候为了等一个包重传,后面一堆包过不来。

UDP: 传输流畅,很快,因为中间错了或者丢包了,也不管,适合网络视频直播,丢一帧两帧的无所谓。

 

post请求:

1.处理普通数据,querystring.

2.处理文件数据 : 不自带处理文件数据的包;处理文件数据的话,需要直接跟二进制数据打交道,不能直接转成字符串(比如readFile读文件中的data,去toString,但是读的直接是文件buffer二进制数据,就不能toString了),如果是文件的话数据就毁了,

上传文件的类型是:enctype="multipart/form-data"

enctype指的是表单编码的类型

如果不给类型的话是:application/x-www.form-urlencoded :这种只能传输文字性数据,他传输不了文件。

上传提交文件:(直接toString()是不对的,但是只是看一眼上传的信息)

输出:

但是我们发现我们上传的a.txt只传到后台一个文件名字(这是不给enctype设置文件类型的话是这样,默认enctype="application/x-www.form-urlencoded")

 

 

下面是给类型后(enctype="multipart/form-data")输出是这样:

 

 数据通信:

ajax、跨域

fetch

Ajax2.0 -> FormData

websocket

 长连接正常的话浏览器发起请求去服务器读数据,读完之后连接就会断开,这叫短连接;

浏览器去请求,请求完了,这个服务器就在那挂着,故意不返回,因为他有个等待时间,这个他有个等待时间,一般情况下一分钟,标准的五分钟,根据浏览器的不同,他就像掐着表比如到58秒了,他返回一个没数据,然后接下来呢,浏览器那边再发起一个请求,然后再等等等,一看有数据了,服务器就返回了,不管是有没有数据,浏览器永远都会在发起一个新的请求,服务器其实就是一直不返回,在那耗着,耗着耗着什么时候有数据了,或者耗到快超时了,再返回回去,这叫长连接。

长连接非常不好的一点是:他非常消耗服务器的资源,服务器的连接数是有限的,如果你配的太高,非常容易被攻击。现在都用websocket,尽管websocket 也是长连接的一种,但是又有所不同。 

跨域问题:

原生ajax:

上面这个文件通过本地打开(file://),那么就会提示跨域错误。 

跨域跟服务器没有半毛钱关系,是浏览器的一种自我保护行为,需要服务器取设置响应头向浏览器声明一下“这是我家人,你别阻拦”

res.setHeader('access-control-allow-origin', '*');
这个响应头意思是所有的源来我这访问数据。

在服务器取打印req.headers请求头:

 这个请求头中的origin是表示请求的原网址,是谁在请求我。

 还可以设置白名单:

 

 fetch:

1.读取

2.解析

原生的ajax太难用了,所以官方就搞出来了一个fetch,它是原生的,不需要引入任何库就有,希望能够替代原来的ajax,用起来更加方便。当然fetch也是异步的。

 fetch读取json数据:

读取二进制数据blob :

 这个url到底是什么?

其实这个url是把你刚才的那个二进制数据临时的写入了chrom的临时文件中去,其实是一个本地的地址:

 

本质上就是一个临时文件,chrom会自己选择,如果是小的,他会放内存,如果非常大,他会放硬盘上,过会自己删。

但是fetch有一个小小的问题:

他会把整个数据全加载过来,然后再开始去做事,所以如果是video,文件很大,所以video直接用切片输出,那样会快很多,能直接播放。所以fetch读取二进制图片为多。

JSOP:安全性非常弱,因为他不需要或许服务器那边的认可,随意的去拿数据,这实际上来说对服务器和客户端都不算安全的,所以这种方式逐渐的被能跨域的ajax所取代了。当年火是因为ajax不能跨域的年代。

JSONP本质上就是个script标签

<script src='其他网站.js'></script>

 其实本质上就是一个函数的引入和调用,比如a.html的js中执行show()方法。a文件引入b.js,b中有x,和y两个变量并有值,那么因为a中引入了b,在a中就可以拿到b中的变量进行操作。

我们引入jq不就是可以使用jq的中的方法么。

比如百度搜索接口:https://www.baidu.com/su?wd=aa&cb=show

这个show是我们自定义的名字,我们在自己的js中可以调用show就可以实现百度搜索功能了

 JQ方式:

formData: 是ajax2.0新增的

有两种方式可以转化为formData:

1)可以把页面中的form转化为form,直接把其包进去

原生ajax方式:

 后台:

因为是post请求,我们安装一个插件:npm i multparty -D;

 我们输入了用户名和密码及上传了图片

运行输出:

jq方式:jq里面带了一个能处理formData的方法

我们之所以用formData只要是用他上传文件类型的操作。前端只需要无脑的往表单里添就行,他会替你往表单里这该怎么弄那该怎么弄,你无需干预。

formData最好用的就是直接表单往里扔,就是以上这种方式。就是包装了一下。

发现没有?用formData时候,我们根本就没有设置enctype="multipart/form-data",他会自动帮我们设置

2)创建一个空的formData,往里面塞东西。

通过append方法添加

 

posted @ 2021-01-13 23:11  猎奇游渔  阅读(215)  评论(0编辑  收藏  举报