征战Node.js 之路


项目同步学习代码仓库: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的模块功能主要有如下所示: 
征战Node.js 之路 - 眷恋天空的驴 - 仇彦龙
5:
创建模块  teacher.js  入口的js文件
导出模块  exports.add =function(){}
加载模块  var teacher = require('./teacher.js')
使用模块  teacher.add('Scott')


7, URI:
 URL:统一资源定位符--网址,是URI的子集。英文,字母数字
 URI:统一资源标识符--字符串格式规范。

URL:模块的文档   查看代码
征战Node.js 之路 - Anikin - Anikin
征战Node.js 之路 - Anikin - Anikin

征战Node.js 之路 - Anikin - Anikin url.parse(urlStr, [parseQueryString--boolern], [slashesDenoteHost--boolern])
   1: 第一个true是讲query也解析为一个对象
   2: 在不知道协议的情况下使用
var htmls = 'http://imooc.com:8080/course/list?from=anikin&course=node#floor1';
   
   
征战Node.js 之路 - Anikin - Anikin
 
   
   
征战Node.js 之路 - Anikin - Anikin

url.resolve() 
征战Node.js 之路 - Anikin - Anikin
url.parser(url,true)
  征战Node.js 之路 - Anikin - Anikin
url.parse(url,true,true)

征战Node.js 之路 - Anikin - Anikin
 
征战Node.js 之路 - Anikin - Anikin 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 第三个参数制定中间连接符号
 征战Node.js 之路 - Anikin - Anikinquerystring.unescape()<=>querystring.escape() 完全是逆序的,实现对特殊字符的编码。

var q = '<仇彦龙>';

querystring.escape(q) =>%3C%E4%BB%87%E5%BD%A6%E9%BE%99%3E


征战Node.js 之路 - Anikin - Anikin   http请求全方位解析
  http协议流程: 

 http在客户端创建接口发起请求 ---->【刷新网址,回车】 http服务器在端口监听客户端的请求--> http服务器向客户端返回状态和内容。
具体细节:
  首先是域名解析,以chrom浏览器为例【hrome://net-internals/#dns  查看chrom自身的dns缓存
  ps: 清楚浏览器缓存可以在chrom下可以使用上面dns方法,也可以使用刷新系统的dns的方法刷新浏览器缓存: ipconfig /flushdns             
征战Node.js 之路 - 眷恋天空的驴 - 眷恋天空的驴
 任何的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
征战Node.js 之路 - Anikin - Anikin
 
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啦!
   征战Node.js 之路 - 眷恋天空的驴 - 眷恋天空的驴!

你可能需要或者会用到的脚手架:

  征战Node.js 之路 - Anikin - Anikin

你需要关心:

征战Node.js 之路 - Anikin - Anikin
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值