Node.js 请求流程简析
Hello,大家好,在学Node.js技术知识之前,我们先来了解一下Node.js的请求流程,请各位看官先看下面这张图片:
平时前端发起AJAX请求,就是在客户端发起请求,调用接口发送请求给服务器,服务器处理请求,对数据库进行操作,比如对数据库进行增删改查的操作,处理完成服务器会把结果作为响应内容返回给客户端(前端),当前端拿到请求返回体之后,根据返回的内容,再去处理页面上相关的业务逻辑。上述是一个大致的前端到后端以及后端回前端的一个流程。
不管是用Node.js,还是JAVA啊,.NET啊,PHP啊等等,都是这样的流程。别的咋样我们不关心,就说Node.js相关的内容。在看官网对Node.js的介绍的部分,我们可能会看到这样的几个词汇,“事件驱动”、“单线程”、“非阻塞I/O”:
事件驱动:简单来说,就是通过事件来进行应用程序的流程控制,提到事件,做前端的同学,估计最先想到的就是click,其实是一样的,前端也是对click绑定事件监听,以事件为驱动来处理相关流程。
单线程:大家都知道浏览器是单线程的,js是单线程的,Node.js也是单线程的,简单来说就是流式处理,事情要一件一件来做,做完一件再做下一件。
非阻塞I/O:非阻塞,如果我们有一截水管,阻塞,就是把水流堵住,不让它流了,非阻塞,反义词呗,就是不会截断水流呗。I就是input,O是output,就是对数据库的操作,提到非阻塞,就会想到异步,想到异步,就会想到回调函数,他们都是做一件事,就是不会阻止代码继续向下执行~
总结一下,Node.js运行的流程就是这样的:Node.js 在执行输入脚本后直接进入事件循环,当没有更多的回调要执行时,Node.js 就会退出事件循环。这种行为就像浏览器的 JavaScript 一样 —— 事件循环对用户是隐藏的。
我们可以看到官网介绍里,有这样的一段话:
这是什么意思呢?就是说,虽然Node.js是单线程的,但是它有一个I/O线程池,可以异步处理I/O,操作,然后通过回调函数去返回处理结果,这个过程,不会阻塞Node.js主流程的进行。
由于Node.js的这一特点,决定了Node.js适合线程密集型操作,而不适合CPU密集型操作。
以上就是我对Node.js请求流程以及特点的理解,如有问题,欢迎留言讨论~
最后我献上一个小例子,帮助大家理解下异步概念:
//引入fs模块 const fs = require('fs'); /* 异步文件写入 */ //打开文件 fs.open('hi.txt','w', function (err, fd){ if(!err){ console.log(fd); fs.write(fd, '异步写入的内容', function (err){ if(!err){ console.log('写入成功了') }; fs.close(fd, function (err){ if(!err){ console.log('文件已关闭') }; }); }) } else { console.log(err) } }) console.log("啦啦啦啦");
从上面的运行截图,我们可以看出来,啦啦啦啦是写在最下面,但是运行的时候,却在最上面,在啦啦啦啦下面打印出来的内容,都是写在回调函数里的哦,事实上并没有阻塞程序的运行~这就是异步啦,对于例子里的代码,大家看不懂也不用介意,需要懂的只是运行顺序就可以了~
- 点赞
- 收藏
- 关注作者
评论(0)