Node.js(六)——HTTP概念进阶

在上面的步骤中扫通了http请求到结束的一个闭环包括请求时的头信息、响应时候服务器返回的头信息,状态码等等

这些在Node http模块中都能获取到并且有相应的接口去组装这些信息和返回它们,同时呢这些http接口在设计的时候就考虑了可以支持许多可以支持http协议的特性

而这些特性在传统的开发中却很难使用,比如大字节的块编码消息

为了让用户在请求和响应的时候使用流的形式操作数据接口缓存整个请求或者响应,整套http api都很底层,它只处理流之间的操作以及信息解析

可以把信息解析为请求头和请求体,但不去解析实际的请求头和请求正文里面的具体内容

这个就是关于NodeJs中http模块的介绍

什么是回调?

回调是异步编程最基本的方法,对于NodeJs来说,需要按顺序执行异步逻辑的时候,一般采取后续传递的方式,也就是将后续逻辑封装在回调函数中作为起始函数的参数,逐层去嵌套 通过这种方式来让程序按照我们所期望的方式走完流程

案例如下:

声明一个learn函数

function learn(something){
	console.log(something)
}

然后再声明个we函数,两个参数

第一个是回调callback,便于理解

function we(callback,something){
	something += ‘ is cool‘
	callback(something)
}

最后来调用

we(learn,‘Nodejs‘)

执行结果如下:

这种是叫做具名函数(具体有名字的函数)

还有一种是匿名函数,直接调用如下:

we(function(something){
	console.log(something)
},‘Jade‘)

执行结果如下:

什么是同步/异步?

对于异步对立就是同步,同步就是执行一个任务,后一个任务等待前一个任务结束,然后再执行。

程序的执行顺序与任务的排列顺序是一致的,浏览器端的js是单线程的,因此js代码只能按顺序执行,即便是js可以并行的去下载但也只能按顺序执行,

如果某个js内有比较耗时的操作,那么页面就会被阻塞,后面的js代码就不会被执行到

比如说一个页面里面有3个js引入

// <script src=‘a.js‘></script>
// <script src=‘b.js‘></script>
// <script src=‘c.js‘></script>
b.js代码如下
var i = 0
while(true){
	i++
}

此js就会被一直阻塞在这里。

异步的模式则完全不同

每个任务都有一个或多个回调函数,前一个任务结束之后不是执行后一个任务,而是执行回调函数,后一个任务也不是等待前一个任务结束就执行任务的执行顺序与排列顺序是不一致的,是异步 的

在JavaScript中最基础的异步函数则是setTimeout和setinterval

setTimeout会在给定的时间结束后执行给定的函数,接受一个回调函数作为第一个参数

代码如下——顺序执行(第一版):

var c = 0

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

function plus(){
	c +=1
}

plus()
printIt()

结果毋庸置疑是:1

结果如下:

如果在plus中有些异步的操作或者比较耗时的操作,那这个时候就不一定

能拿到我们所期望的结果,加个setTimeout,然后再执行,那么能拿到什么样的结果呢?

代码如下——阻塞执行(第二版):

var c = 0

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

function plus(){
	setTimeout(function(){
		c +=1
	},1000)
}

plus()
printIt()

执行结果如下:

这就不是我们所期望的那个1

那这个时候怎么办呢?

可以把plus方法改造一下,传递一个回调函数,然后再setTimeout里面调用回调函数,

然后把结果传递下去,最后把printIt作为参数传递给plus

代码如下——顺序执行(第一版):

var c = 0

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

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

plus(printIt)

执行结果如下:

最后打印出了我们所期望的结果:就是1

什么是I/O?

磁盘的写入和读取在NodeJs里,本身呢就是为文件系统、数据库之类的资源提供接口,

向文件系统发送一个请求的时候,不用等待硬盘,等硬盘准备好了之后,非阻塞接口会通知到NodeJs

什么是单线程/多线程?

单线程对应的就是多线程

单线程:程序的功能按照顺序来执行,只有前面的流程都执行成功以后,

后面的流程才能被执行到

单线程特点:安全

各有优缺点,多线程就是要把握好资源调配

什么是阻塞/非阻塞?

什么是事件?

什么是事件驱动?

什么是基于事件驱动的回调?

什么是事件循环?

时间: 2024-10-11 18:24:55

Node.js(六)——HTTP概念进阶的相关文章

node.js(六) UTIL模块

1.inspect函数的基本用法 util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换为字符串的函数,通常用于调试和错误输出.它至少接受一个参数object,即要转换的对象,我们来学习它的简单用法.使用语法如下: var util = require('util'); var result = util.inspect(object); console.log(result); 2.format函数的基本用法 format函数根

创业笔记-Node.js入门之一个完整的基于Node.js的web应用

用例 我们来把目标设定得简单点,不过也要够实际才行: 用户可以通过浏览器使用我们的应用. 当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单. 用户可以选择一个图片并提交表单,随后文件将被上传到http://domain/upload,该页面完成上传后会把图片显示在页面上. 差不多了,你现在也可以去Google一下,找点东西乱搞一下来完成功能.但是我们现在先不做这个. 更进一步地说,在完成这一目标的过程中,我们不仅仅需要基础的代码而不管代码是否优

[转载]Node入门 &#187; 一本全面的Node.js教程

http://www.nodebeginner.org/index-zh-cn.html 作者: Manuel Kiessling 翻译: goddyzhao & GrayZhang & MondayChen 关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版.因此,只有当进行错误更正以及针对新版本Node.js的改动进行对应的修正时,才会进行

node.js精彩入门手册

最近刚好在学习nodejs,发现了一份不错的文档,分享一下 JavaScript与Node.js JavaScript与你 抛开技术,我们先来聊聊你以及你和JavaScript的关系.本章的主要目的是想让你看看,对你而言是否有必要继续阅读后续章节的内容. 如果你和我一样,那么你很早就开始利用HTML进行“开发”,正因如此,你接触到了这个叫JavaScript有趣的东西,而对于JavaScript,你只会基本的操作——为web页面添加交互. 而你真正想要的是“干货”,你想要知道如何构建复杂的web

Node.js入门教程

http://www.nodebeginner.org/index-zh-cn.html#a-basic-http-server Node入门 作者: Manuel Kiessling翻译: goddyzhao & GrayZhang & MondayChen 关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版.因此,只有当进行错误更正以及针对

Node.js详解整理:node.js的优势、特点、优缺点及适用场景,安装及基本使用

目录 Node.js基础 一.Node.js介绍 二.node.js的优势 三.NodeJS的特点 四.NodeJS带来的对系统瓶颈的解决方案 五.NodeJS的优缺点 六.适合NodeJS的场景 Node.js的安装及基本使用 Node.js 安装配置 第一个Node.js程序:Hello World! Node.js 创建第一个应用 express的使用(待整理) koa2的使用(待整理) Node.js基础 一.Node.js介绍 Node.js是一个javascript运行环境.它让ja

Node.js入门:文件查找机制

文件查找流程图 从文件模块缓存中加载 尽管原生模块与文件模块的优先级不同,但是都不会优先于从文件模块的缓存中加载已经存在的模块. 从原生模块加载 原生模块的优先级仅次于文件模块缓存的优先级.require方法在解析文件名之后,优先检查模块是否在原生模块列表中.以http模块为例,尽管在目录下存在一个http/http.js/http.node/http.json文件,require("http")都不会从这些文件中加载,而是从原生模块中加载. 原生模块也有一个缓存区,同样也是优先从缓存

深入浅出Node.js(一):什么是Node.js

Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟Joyent获得企业资助,再到今年发布Windows移植版本,Node.js的前景获得了技术社区的肯定.InfoQ一直在关注Node.js的发展,在今年的两次Qcon大会(北京站和杭州站)都有专门的讲座.为了更好地促进Node.js在国内的技术推广,我们决定开设“深入浅出Node.js”专栏,邀请来自Node.js领域的布道师.

Node.js 创建HTTP服务器(经过测试,这篇文章是靠谱的T_T)

Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求根本不需 要 PHP 来处理. 不过对 Node.js 来说,概念完全不一样了.使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器.事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的.