慕课网《进击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系统调用的详细过程:
Chrome调试工具Network—Timing面板信息:
Network—XHR—Headers—Form Data是表单请求数据。
http请求方法:
状态码:服务器端返回浏览器,告知浏览器请求成功或失败的信息
200:OK,请求成功
400:客户端请求有语法错误
401:请求未经授权
403:收到请求,但不提供服务
404:资源未找到
500:服务器端未知错误
503:服务器端当前不能处理请求
HTTP事件回调进阶:
HTTP模块:
HTTP概念进阶;
回调:回调时异步编程时的基础,将后续逻辑封装成起始函数的参数,逐层嵌套。
-- 回调实例
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的耗时操作、延时操作等,这个时候每次操作都要调用相应的回调函数完成这些密集任务,要保证任务的执行不会造成阻塞,我们就需要一个机制来管理这些操作,这个机制就是事件循环。
同步异步阻塞非阻塞详细介绍:
http://www.cnblogs.com/George1994/p/6702084.html#4001054
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.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
http://www.cnblogs.com/woodyblog/p/6061671.html
http://blog.csdn.net/z69183787/article/details/52910484