Node.js 请求流程简析

举报
bjxingch 发表于 2020/09/13 11:39:06 2020/09/13
【摘要】 Hello,大家好,在学Node.js技术知识之前,我们先来了解一下Node.js的请求流程,请各位看官先看下面这张图片: 平时前端发起AJAX请求,就是在客户端发起请求,调用接口发送请求给服务器,服务器处理请求,对数据库进行操作,比如对数据库进行增删改查的操作,处理完成服务器会把结果作为响应内容返回给客户端(前端),当前端拿到请求返回体之后,根据返...

       


        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("啦啦啦啦");


从上面的运行截图,我们可以看出来,啦啦啦啦是写在最下面,但是运行的时候,却在最上面,在啦啦啦啦下面打印出来的内容,都是写在回调函数里的哦,事实上并没有阻塞程序的运行~这就是异步啦,对于例子里的代码,大家看不懂也不用介意,需要懂的只是运行顺序就可以了~


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。