nodejs是用来做什么的?

明烟雨任      2022-02-08     326

关键词:

有些人说“这是一种通过javascript语言开发web服务端的东西”。更直白的可以理解为:node.js有非阻se塞,事件驱动/O等特性,从而让高并发(high concurrency)在的轮询和comet构建的应用中成为可能。

  浏览器给网站发请求的过程一直没怎么变过。当浏览器给网站发了请求,服务器收到了请求,然后开始搜寻被请求的资源。如果有需要,服务器还会查询一下数据库,最后把响应结果传回浏览器。不过,在传统的web服务器中,比如apache服务器,每一个请求都会让服务器创建一个新的进程来处理这个请求。

  后来又了ajax。有了ajax,我们就不用每次都请求一个完整的新页面了,取而代之的是每次只请求需要的部分就可以了。这显然是一个进步。但是比如你要建一个FriendFeed这样的社交网站(类似人人网那样的刷朋友新鲜事的网站),你的好友会随时的推送新的状态,然后你的新鲜事会实时自动刷新。要达成这个需求,我们需要让用户一直与服务器保持一个有效链接。目前最简单的实现方法就是让用户和服务器之间保持长轮询(long polling)。

  http请求不是持续的链接,你请求一次,服务器响应一次,然后就完了。长轮询是一种利用http模拟持续连接的技巧。具体来说或,只要页面载入了,不管你需不需要服务器给你相应信息,你都会给服务器发一个ajax请求。这个请求不同于一般的ajax请求,服务器不会直接给你返回信息,而是它要等着,直到服务器觉得该给你发信息了,它才会响应。比如,你的好友发了一条新鲜事,服务器就会把这个新鲜事当作响应发给你的浏览器,然后你的浏览器就刷新页面了。浏览器收到响应刷新完之后,再发送一条新的请求给服务器,这个请求依然不会立即被响应。于是就开始重复以上步骤。利用这个方法,可以让浏览器始终保持等待响应的状态。虽然以上过程依然只有非持续的http参与,但是我们模拟出了一个看似持续的连接状态

我们再看传统的服务器比如apache。每次一个新用户连到你的网站上,你的服务器就得开一个连接,每个连接都需要占用一个进程,这些进程大部分时间都是闲着的(比如等着你的好友发新鲜事,等好友发完才给用户响应信息。或者等着数据库返回查询结果什么的)。虽然这些进程闲着,但是照样占用内存。这意味着,如果用户连接数的增长到一定规律,你服务器没准就要耗光内存直接瘫痪了。

这种情况怎么解决?解决的方法就是刚才上边说的:非阻塞和事件驱动。这些概念在我们谈的这个情景里面其实也没那么难理解。把非阻塞的服务器想象成一个loop循环,这个loop会一个跑下去。一个新请求来了,这个loop就接了这个请求,把这个请求传给其他的进程(比如传给一个搞数据库查询的进程),然后响应一个回调(callback)。完事了这个loop继续跑,接其他的请求。这样下来,服务器就不会像之前那样傻等着数据库返回结果了。

如果数据库把结果返回了,loop就把结果传回用户的浏览器。接着继续跑。在这种方式下,你的服务器的进程就不会闲着等着了。从而在理论上说,同一时刻的数据库查询数量,以及用户的请求数量就没有限制了。服务器只在用户那边有事发生的时候才响应,这就是事件驱动。

FriendFeed是用基于Python的非阻塞框架Tornado(知乎也用了这个框架)来实现上面说的新鲜事功能的。不过nodejs就比前者更妙了。nodejs的应用是通过javascript开发的,然后直接在google的变态V8引擎上跑。用了nodejs,你就不用担心担心用户端的请求会在服务器里跑了一段能够造成阻塞的代码了。因为javascript本身就是事件驱动的脚本语言。你回想一下,在给前端写javascript的时候,更多时候你都是在搞事件处理和回掉函数。javascript本身就是给事件处理量身定制的语言。

动态ip的功能是什么?动态ip能用来做什么用途?

什么是IP地址  IP地址是指互联网协议地址,是IPAddress的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。目前还有些ip代理软件,但... 查看详情

bi软件用来做什么?

商业智能又称商业智慧或商务智能,简称:BI,指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。一、BI软件可以连接不同各种数据库和文件的数据。无论是制作报表进行数据... 查看详情

“开发人员有效负载”的目的是啥?它可以用来做啥?

】“开发人员有效负载”的目的是啥?它可以用来做啥?【英文标题】:Whatisthepurposeofthe"developerpayload"?Whatcanitbeusedfor?“开发人员有效负载”的目的是什么?它可以用来做什么?【发布时间】:2012-02-1508:23:04【问题描述】... 查看详情

md5和的价值体现在哪里,它是用来做什么的?

MD5 和的价值体现在哪里,它是用来做什么的?MD5和是由字母和数字构成的字符串,起到了文件指纹的作用。如果两个文件有相同的MD5和值,那么,文件完全相同。您可以为每一软件下载使用所提供的MD5和值,验证您下载的文... 查看详情

vue环境部署

...是JavaScript?javascript是一门运行在浏览器端的脚本语言,用来做客户端页面的交互。JavaScript的运行环境呢?故名思意他的运行环境就是浏览器,但是真的是这样的吗?其实不然,他的真正运行环境其实是运行在浏览器内核中的js... 查看详情

navicatmac虚拟组和连接颜色是用来做什么的

Navicat Mac虚拟组旨在提供一个按类别逻辑分组对象的平台,以便使全部对象得到有效保护。NavicatMac提供颜色高亮显示连接以识别连接及它们的数据库对象。NavicatMac虚拟组虚拟组NavicatMac虚拟组旨在提供一个按类别逻辑分组对... 查看详情

spring中aop主要用来做什么。spring注入bean的方式。什么是ioc,什么是依赖注入

Spring中主要用到的设计模式有工厂模式和代理模式。IOC:InversionofControl控制反转,也叫依赖注入,通过 sessionfactory 去注入实例;IOC就是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是通过容器... 查看详情

node.js是用来做什么的?应该如何系统学习?(代码片段)

node.js介绍目录node.js介绍node.js是什么?node.js有哪些特点?node.js网站为什么要学习Node.js?学习目标Node.js安装和配置Node.js开发Web应用程序和PHP、Java、http://ASP.Net等传统模式开发Web应用程序区别node.js是什么?node.js是一个... 查看详情

python编程是用来做什么的?python对商业的好处

编程语言使我们能够开发有用的程序和产品,以及高效的数字解决方案。许多企业使用编程来自动化他们的业务流程,评估他们的性能,分析客户数据,以及许多其他的事情。而且,虽然现在使用了许多不同... 查看详情

什么是机器视觉?可以用来做什么

...据判别的结果来控制现场的设备动作。2、机器视觉可以用来做什么?机器视觉系统可以快速获取大量信息,而且易于自动处理,也易于同设计信息以及加工控制信息集成,因此,在现代自动化生产过程中,人们将机器视觉系统... 查看详情

redis是什么?用来做什么?要掌握到什么程度?

redis是什么?用来做什么?要掌握到什么程度?|redis数据库|中间件|mysql|分布式|redis命令|redis源码专注于服务器后台开发,包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB, 查看详情

nodejsmocha测试学习

...,那怎么办?需要引入单元测试去做基础的测试目前Nodejs用来做单元测试的工具接触的不多,现在只接触到Mocha,它是用来做单元测试的最好的工具之一。关于Mocha的基础教程,可以看一下阮一峰老师的博客:测试框架Mocha实例教... 查看详情

搞定什么是nodejs它和npm关系与应用(代码片段)

...角就是nodeJs什么是nodejsjavaScript是一门脚本语言,通常被用来编写、执行本地源代码。脚本语言需要一个解析器才能运行,HTML文件中的JavaScript代码由浏览器解析执行。而自行执行JavaScript代码则需要Node.js解析器才能运行。每个解... 查看详情

!importantzookeeper用来做什么的,有几种类型的节点

zookeeper=文件系统+通知机制一、Zookeeper提供了什么1、文件系统Zookeeper维护一个类似文件系统的数据结构每个子目录项如NameService都被称为znoed,和文件系统一样,我们能够自由的增加、删除znode,在znode下增加、删除子znode,唯一不同... 查看详情

python集合可以用来做啥?原来这些功能才是最实用的

...合里的元素可以是列表,元组,字典,那么python集合可以用来做什么?原来这些功能才是最实用的,现在就思考一下python集合可以用来做什么?原来这些功能才是最实用的。参考技术A集合可以像元组一样,设置不可改变的类型;... 查看详情

第二课

...标准。HTML元素标签、属性都是什么概念?答:元素标签用来描述网页,属性用来提供html标签的更多信息。文档类型是什么概念,起什么作用?答:在互联网上有许多不同的文档,只有了解文档类型,浏览器才能正确的显示文档... 查看详情

python中的subprocess.call()是用来做啥的? [关闭]

】python中的subprocess.call()是用来做啥的?[关闭]【英文标题】:subprocess.call()inpythonisusedfor?[closed]python中的subprocess.call()是用来做什么的?[关闭]【发布时间】:2020-03-1803:10:40【问题描述】:roadSegCommand=segBin+pred_img+self.out_dir#Herewearea... 查看详情

nodejs难点(网络,文件)的核心stream三:readable?

什么是可读流可读流是生产数据用来供程序消费的流。我们常见的数据生产方式有读取磁盘文件、读取网络请求内容等,看一下前面介绍什么是流用的例子:constrs=fs.createReadStream(filePath);rs就是一个可读流,其生产数据的方式是... 查看详情