项目同步学习代码仓库:https://github.com/Anikinly/node
1. nodejs和我们普通的js执行的环境是不一样的,全局对象是global(js是window).
process全局的进程对象,通过这个对象提供的属性跟方法,使得我们可以对当前运行的程序跟进程进行控制;
2: node 是模块化的,遵循了commenJs(是一套js的规则)的规范。因此没有全局命名空间,不用担心命名冲突。
一个文件就是一个模块,每一个模块都有自己的作用域。所以每一个变量都是在局部的。
eg: 如果想设置全局的则必须挂在到global下面: global.a = 200;
node 中的模块加载机制
1: 路径问题: 可以是相对的,或者是绝对的路径
2: 相对路径: 需要写成: './module.js';
3: 加载node的核心模块的写法: 'module.js';
4: 查找机制: 首先会按照加载的模块名称查找,如果没有找到则会在后面加上.js的后缀进行查找
如果还没有找到,则会在后面加上.json的后缀查找
如果还没有找到,则会在后面加上.node的后缀查找
文件名称->.js->.json->.node
3: 一般是通过npm这个管理工具往自己的项目中引进来需要的模块和包的。
4: node的模块功能主要有如下所示:
5:
创建模块 teacher.js 入口的js文件
导出模块 exports.add =function(){}
加载模块 var teacher = require('./teacher.js')
使用模块 teacher.add('Scott')
7, URI:
URL:统一资源定位符--网址,是URI的子集。英文,字母数字
URI:统一资源标识符--字符串格式规范。
URL:模块的文档
查看代码
url.parse(urlStr, [parseQueryString--boolern], [slashesDenoteHost--boolern])
1: 第一个true是讲query也解析为一个对象
2: 在不知道协议的情况下使用
var htmls = 'http://imooc.com:8080/course/list?from=anikin&course=node#floor1';
url.resolve()
url.parser(url,true)
url.parse(url,true,true)
querystring.stringfy() <=> querystring.parse() 两个是完全相反的
var q = {name:'anikin',age:'23',alls:['jack','rose'],from:'hexun'};
querystring.stringify(q)=>name=anikin&age=23&alls=jack&alls=rose&from=hexun 序列化
querystring.stringfy(q,'@')=>name=anikin@age=23@alls=jack@alls=rose@from=hexun 第二个参数制定连接标志
querystring.stringfy(q,'@',':' )=>name:anikin@age:23@alls:jack@alls:rose@from:hexun 第三个参数制定中间连接符号
querystring.unescape()<=>querystring.escape() 完全是逆序的,实现对特殊字符的编码。
var q = '<仇彦龙>';
querystring.escape(q) =>%3C%E4%BB%87%E5%BD%A6%E9%BE%99%3E
http请求全方位解析
http协议流程:
http在客户端创建接口发起请求 ---->【刷新网址,回车】
http服务器在端口监听客户端的请求-->
http服务器向客户端返回状态和内容。
具体细节:
首先是域名解析,以chrom浏览器为例【hrome://net-internals/#dns 查看chrom自身的dns缓存
】
ps: 清楚浏览器缓存可以在chrom下可以使用上面dns方法,也可以使用刷新系统的dns的方法刷新浏览器缓存:
ipconfig /flushdns
任何的http请求可以分为:
请求+响应
二者的共性都是带着http请求头和发送的正文信息
http头:就是发送的一些附加的信息,内容类型服务器发送响应的日期和http状态码
正文: 就是提交的数据或者返回的数据
三次握手: 所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收 到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。 上面这定义太tm扯淡了:三次握手是为了确认客户端跟服务器都能接受到对方的信息
第一次
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:‘
关于三次握手简单通俗的描述:
「你瞅啥?」 「瞅你咋地?」 「来咱俩唠唠。」
然后就唠上了。
’
衍生阅读: 为什么要进行三次握手跟四次挥手呢?
|
http请求方法
http状态码
nodejs: 非阻塞 单线程 事件驱动 适合高并发 i/o的密集操作
https://nodejs.org/docs/v0.10.35/api/http.html
http压力测试:
apache ab是Apache自带的压力测试工具:可以模拟各种情况下的对web服务器的压力测试请求,不包括网络的
传输时间和本地的计算时间可以远程或者本地做压力测试,url必须要以‘/’结尾
性能测试工具 ,切换到apache目录下面的bin下面: ab -n1000 -c10 http://localhost:2015/
-n :总共的请求执行数,缺省是1;
-c: 并发数,缺省是1;
-t:测试所进行的总时间,秒为单位,缺省50000s
-p:POST时的数据文件
-w: 以HTML表的格式输出结果
npm install cheerio 相当于是服务器端的jquery实现对爬去过来的dom元素的数据进行操作
get/request的请求: 更新同步后台的数据
http.request(options,[callback])
Global:
__filename: 返回的是当前模块文件解析后的绝对路径,该属性不是全局的,是模块作用域下面的
__dirname: 返回的是文件件,该属性不是全局的,是模块作用域下面的
stdin stdout: 标准输入输出流(IO)【比喻: 键盘--打印机】
stdin和stdout 提供了操作输入数据和输出数据的方法,我们也通常称之为IO操作。
stdin 标准输入流
stdout 标准输出流
Buffer 一个更好的操作二进制数据的类 一个全局的类、类似数组 [
查看代码实例
]
在node中我们其实是操作的是二进制流,所有的东西最后都会转换为二进制流
搜索工具: http://www.googto.com/
方法1:buf.write(); buf.write(string, [offset], [length], [encoding])
* [offset]: 开始写入的位置
* [length]: 写入对象中的长度
* [encoding]: 默认的是utf-8
* 2: buf.toString([encoding], [start], [end]) 将buffeer转换为string类型的
* 3: buf.toJSON() 将buffer转化为json对象的形式
* 4: buf.slice([start], [end]) 片段的截图操作,修改后的buffer地址指向跟原先的buffer地址是同一个地址
* 5: buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]) buff对象的拷贝,不影响原来的buffer对象
* targetBuffer: 需要拷贝的buff对象
* 6: 静态方法 Buffer.isEncoding(encoding)
* 7: 判断Buffer.isBuffer(obj)
* 8: 直接判断字节长度,不用转化toSting(): Buffer.byteLength(string, [encoding])
* 不同的编码占据的字节长度是不一样的。
* 9: Buffer.concat(list, [totalLength])
* list {Array}数组类型,Buffer数组,用于被连接。
流操作
buffer 是保存原始数据,流是移动数据的,二者结合使用 【 直接看代码
】
对于大质量文件,多批次密集请求如果按照之前的buffer实现读入之后再操作,会不太会实现,因此流的操作实现的是边读入边写的过程。node很多模块都是用了这个抽象的模块buffer http等。
.on('data',function(chunk){ }) // 这个事件就是说事件在传递时候触发chunk的这个数据块
.end 流传递结束后触发
一般在写入的时候要防爆仓的操作,防止被爆仓之前需要判断缓存中的文件是不是已经完全的写入完成。
readStream.pause() 暂停
readStream.resume() 重新开启写入功能
writeSteam.drain() 耗尽,也就是数据写入完成了
修改npm安装模块的位置:
1:
npm config ls 就可以查看到node的安装模块的各个路径问题
2:
npm config ls 进行修改,则就ok啦!
你可能需要或者会用到的脚手架:
你需要关心: