进击Node.js基础(1)

慕课网《进击Node.js基础》笔记

1.基础知识

//加载http模块,职责是创建web服务器,处理HTTP相关任务
var http = require('http');

// createServer创建一个web服务器,通过listen指定端口监听请求,就可以接收来自端口的请求
// function是接收到请求之后要做什么,就是回调函数
// 传入两个参数,request是请求体 respond是响应体
http.createServer(function (request, response) {

    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(8888,'127.0.0.1');

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

浏览器的全局变量是window。
nodejs的全局变量是process。

2.Node.js API主要介绍

URL:统一资源定位符
URI:统一资源标识符
URL是URI的子集。

URL模块:

-- URL网址解析
url.format("地址") 生成url地址
url.resolve("HTTP://imooc.com",'/course/list');生成url地址
url.parse("地址");解析url地址成分

url.parse('www.imooc.com')
-- 返回结果
Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: null,
  query: null,
  pathname: 'www.imooc.com',
  path: 'www.imooc.com',
  href: 'www.imooc.com' }

url.format({
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: null,
  query: null,
  pathname: 'www.imooc.com',
  path: 'www.imooc.com',
  href: 'www.imooc.com' 
})
-- 返回结果
www.imooc.com

url.resoleve('http://imooc.com/','/course/list')
-- 返回值
'http://imooc.com/course/list'

querystring:

-- 序列化
querystring.stringify({name:'scott',course:['jade','node'],form:''})
-- 输出结果
'name=scott&course=jade&course=node&form='
querystring.stringify({name:'scott',course:['jade','node'],form:''},',')
-- 输出结果
'name=scott,course=jade,course=node,form='
querystring.stringify({name:'scott',course:['jade','node'],form:''},',',':')
-- 输出结果
'name:scott,course:jade,course:node,form:'

-- 反序列化
var par ="陈子昂&";
var obj ={name:par ,course:["see","node"],from:'s1'};
var test = querystring.stringify(obj," ");
console.log("序列化 "+test);
var test = querystring.parse(test);
console.log("反序列化 ",test);

-- 转义和反转义
console.log("转义",querystring.escape(par));
console.log ("反转义",querystring.unescape(test));

HTTP:

浏览器后计算机 访问一个 地址的大概操作步骤:
1. 浏览器(如Chrome)搜索自身的DNS 缓存
2. 搜索操作系统自身的DNS缓存(浏览器没有找到缓存或缓存已经失效)
3. 读取本地的 HOST 文件
4. 浏览器 发起一个DNS 的 一个系统调用
5. 浏览器获得域名对应的 IP 地址后,发起 HTTP 的“三次握手”(就是浏览器向服务器发送TCP/IP请求,TCP请求通过层层的路由设备到达服务器,进入到网卡,进入到内核的TCP/IP协议栈,还有可能经过防火墙的过滤,最终到Web服务器端,最终建立TCP/IP连接。)
6. TCP/IP 连接建立起来后,浏览器就可以向服务器发送 HTTP 请求了,例如使用 HTTP 的 GET 方法请求一个根域里的一个域名,协议可以采用 HTTP 1.0 的一个协议。
7. 服务器端接收到了这个请求,根据路径参数,竞购后端的一些处理后,把处理的一个结果的数据返回给浏览器,如果是 目标网 的页面就会把完整的 HTML 页面代码返回给浏览器。
8. 浏览器拿到了 目标网 的完整的HTML 页面代码,在解析和渲染这个页面的时候,里面的 JS 、CSS、 图片静态资源,他们同样也是一个个 HTTP 请求,都需要上面的主要七个步骤
9. 浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现给用户

DNS系统调用的详细过程:

  • 宽带运营商服务器查看本身缓存
  • 运营商服务器发起一个迭代DNS解析的请求(可能涉及域名、域、顶级域的联系,就是如果找不到,就向上一级进行请求。)
  • 运营商服务器把结果返回操作系统内核同时缓存起来,操作系统内核把结果返回浏览器。最终浏览器拿到了网站对应的IP地址。

Chrome调试工具Network—Timing面板信息:

  • Timing:资源加载所要耗费的时间线
  • Stalled:等待实际,浏览器要发生请求,到能发出请求的时间(比如代理协商、配置脚本、等待可复用的TCP连接释放的时间)。不包括DNS查询和连接建立时间
  • Proxy negotiate:代理协商的时间
  • Request sent:请求时间。从请求报文的第一个字节发出,到最后一个字节发生完毕的时间
  • Waiting(TTFB):请求发出后至第一个字节响应的时间
  • Content Download:从接受到响应第一个字节开始到最后一个字节结束花费的时间

Network—XHR—Headers—Form Data是表单请求数据。

http请求方法:

  • Get:获取,读取数据
  • Post:提交资源
  • Put:更新(头像、资料之类)
  • Delete:删除
  • Head 与get方法相同,但服务器不传回资源
  • TRACE
  • OPTIONS

状态码:服务器端返回浏览器,告知浏览器请求成功或失败的信息

  • 1XX请求已经接受
  • 2XX请求成功并处理成功
  • 3XX重定向
  • 4XX客户端错误
  • 5XX服务器端错误

200:OK,请求成功
400:客户端请求有语法错误
401:请求未经授权
403:收到请求,但不提供服务
404:资源未找到
500:服务器端未知错误
503:服务器端当前不能处理请求

HTTP事件回调进阶:

HTTP模块:

  • 支持更多特性
  • 不缓冲请求和响应
  • 处理流相关

HTTP概念进阶;

  • 什么是回调?
  • 什么是同步/异步?
  • 什么是I/O?
  • 什么是单线程/多线程?
  • 什么是阻塞/非阻塞?
  • 什么是事件?
  • 什么是事件驱动?
  • 什么是基于事件驱动的回调?
  • 什么是事件循环?

回调:回调时异步编程时的基础,将后续逻辑封装成起始函数的参数,逐层嵌套。

-- 回调实例
function learn(something){
    console.log(something)
}
function we(callback,something){
    something += ' is cool'
    callabck(something)
}

we(learn,'Nodejs')

-- 匿名回调函数
we(function(something){
    console.log(something)
},'Jade')

同步:发送方发出数据后,等待收方发出响应以后才发下一个数据包的通讯方式。

异步:发送放发出数据后,不等待收方发出响应,接着发送下个数据包的通讯方式。

var c = 0
function printIt(){
    console.log(c)
}
function plus(){
    setTimeout(function(){
        c + =1
    },1000)
}

plus()
printIt()


var c = 0

function printIt(){
    console.log(c)
}

function plus(callback){
    setTimeout(function){
        c + = 1
    }
}

JavaScript是单线程,只能按顺序执行文件,但是可以通过setTimeout(),setInterval()来进行延时处理某个函数,实现后续函数的执行。

I/O:磁盘的写入(IN),磁盘的读取(OUT)

单线程:一次只能执行一个程序叫做单线程。

多线程:一次能执行多个程序叫多线程。

阻塞:前一个程序未执行玩就得一直等待。

非阻塞:前一个程序未执行完时可以挂起,继续执行其他程序,等到使用时再执行。

事件:一个触发动作(例如点击按钮)

事件驱动:一个触发动作引起的操作(例如点击按钮后弹出一个对话框)

基于事件驱动的回调:为了某个事件注册了回调函数,但是这个回调函数不是马上执行,只有当事件发生的时候,才会调用回调函数,这种函数执行的方式叫做事件驱动。这种注册回调就是基于事件驱动的回调,如果这些回调和异步I/O操作有关,可以看作时基于回调的异步I/O,只不过这种回调在nodejs中是由事件来驱动的。
举个简单例子:比如你定了个闹钟叫你早上6点起床,闹钟到6点准时响起,这就是一个事件,当你被闹钟吵醒,接下来你要做什么事,就是这个事件驱动的回调。这个回调的处理是你一开始就安排好的,只是说要等到某一个事件产生,你才会去做这件事。

事件循环:事件循环Eventloop,倘若有大量的异步操作,一些I/O的耗时操作,甚至是一些定时器控制的延时操作,它们完成的时候都要调用相应的回调函数,从而来完成一些密集的任务,而又不会阻塞整个程序执行的流程,此时需要一种机制来管理,这种机制叫做事件循环。总而言之:管理大量异步操作的机制叫做事件循环。
当你的程序有大量的异步操作、I/O的耗时操作、延时操作等,这个时候每次操作都要调用相应的回调函数完成这些密集任务,要保证任务的执行不会造成阻塞,我们就需要一个机制来管理这些操作,这个机制就是事件循环。

同步异步阻塞非阻塞详细介绍:
https://www.zhihu.com/search?type=content&q=%E5%90%8C%E6%AD%A5%20%E5%BC%82%E6%AD%A5
https://www.cnblogs.com/c3gen/p/6170504.html
http://www.voidcn.com/article/p-rppjorhv-bnx.html
http://www.cnblogs.com/woodyblog/p/6061671.html
http://www.voidcn.com/article/p-gguozqft-re.html

相关文章
相关标签/搜索