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() :解释,可以帮你把一堆的路径解析成单一的地址
比如:
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://),那么就会提示跨域错误。
跨域跟服务器没有半毛钱关系,是浏览器的一种自我保护行为,需要服务器取设置响应头向浏览器声明一下“这是我家人,你别阻拦”
在服务器取打印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方法添加