我对这类东西很陌生,但最近我听到了很多关于Node.js有多好的消息。考虑到我非常喜欢使用jQuery和JavaScript,我不禁想知道如何决定何时使用Node.js。

从过去几天我做的所有作业中,我得到了以下信息。节点.js

是一个命令行工具,可以作为常规web服务器运行,并允许运行JavaScript程序利用了出色的V8 JavaScript引擎当你需要同时做几件事时是基于事件的,所以所有类似Ajax的精彩内容都可以在服务器端完成让我们在浏览器和后端之间共享代码让我们谈谈MySQL

我遇到的一些来源是:

深入Node.js–介绍和安装了解NodeJS按示例列出的节点(存档.is)让我们制作一个Web应用程序:NodePad

考虑到Node.js几乎可以在Amazon的EC2实例上开箱即用,我试图了解Node.js需要什么类型的问题,而不是PHP、Python和Ruby等强大的王者。我知道这确实取决于一个人对语言的专业知识,但我的问题更多地属于一般范畴:什么时候使用特定的框架,它特别适合什么类型的问题?


当前回答

简而言之:

Node.js非常适合具有大量并发连接的应用程序,每个请求只需要很少的CPU周期,因为事件循环(与所有其他客户端)在函数执行期间被阻塞。

关于Node.js中事件循环的一篇好文章是Mixu的技术博客:了解Node.js事件循环。

其他回答

我认为Node.js最适合实时应用程序:在线游戏、协作工具、聊天室,或者任何一个用户(或机器人?或传感器?)使用应用程序所做的事情都需要立即被其他用户看到,而无需刷新页面。

我还应该提到,Socket.IO与Node.js的结合将比长轮询更进一步地减少实时延迟。作为最坏的情况,Socket.IO将退回到长轮询,而是使用web套接字甚至Flash(如果可用的话)。

但我还应该提到,Node.js可以更好地解决代码可能由于线程而阻塞的任何情况,或者需要应用程序是事件驱动的任何情况。

此外,Ryan Dahl在我曾经参加的一次演讲中表示,Node.js基准测试在常规旧HTTP请求方面与Nginx不相上下。因此,如果我们使用Node.js构建,我们可以非常有效地服务于我们的正常资源,当我们需要事件驱动的东西时,它就可以处理它了。

此外,它一直都是JavaScript。整个堆栈上都是Lingua Franca。

最适合并发请求处理的节点-

那么,让我们从一个故事开始。在过去的两年里,我一直致力于JavaScript和开发web前端,我很喜欢它。后端的家伙们为我们提供了一些用Java、python编写的API(我们不在乎),我们只需编写一个AJAX调用,获取数据,然后猜一猜!我们完成了。但实际上,这并不是那么容易,如果我们获取的数据不正确或存在服务器错误,那么我们就卡住了,我们必须通过邮件或聊天联系我们的后端人员(有时也在whatsApp上:)这不酷。如果我们用JavaScript编写API并从前端调用这些API呢?是的,这很酷,因为如果我们在API中遇到任何问题,我们可以调查它。猜猜看!你现在可以这样做了,怎么做节点就在那里。

Ok同意您可以用JavaScript编写API,但如果我对上述问题没有异议,该怎么办。您还有其他理由使用node for rest API吗?

这就是魔法的开始。是的,我确实有其他理由将节点用于我们的API。

让我们回到传统的rest API系统,它基于阻塞操作或线程。假设发生两个并发请求(r1和r2),每个请求都需要数据库操作。因此,在传统系统中会发生什么:

1.等待方式:我们的服务器开始服务r1请求并等待查询响应。r1完成后,服务器开始为r2服务,并以相同的方式执行。所以等待不是一个好主意,因为我们没有那么多时间。

2.线程方式:我们的服务器将为两个请求r1和r2创建两个线程,并在查询数据库后达到它们的目的,速度非常快。但这会消耗内存,因为您可以看到,我们启动了两个线程。当两个请求都在查询同一数据时,问题也会增加,因此您必须处理死锁问题。所以这比等待要好,但问题仍然存在。

现在,节点将如何执行此操作:

3.Nodeway:当同一个并发请求进入节点时,它将使用回调注册一个事件,并继续前进,它不会等待特定请求的查询响应。因此,当r1请求到来时,节点的事件循环(是的,节点中有一个事件循环用于此目的)。)使用其回调函数注册事件,并继续服务r2请求,同样,使用回调函数注册其事件。每当任何查询完成时,它都会触发相应的事件,并在不中断的情况下执行回调以完成。

所以,无需等待,无需线程,无需内存消耗——是的,这是服务rest API的节点方式。

我可以分享一些使用node js的地方和原因。

对于聊天、协作编辑等实时应用程序,我们最好使用nodejs,因为它是从服务器向客户端发送事件和数据的事件库。简单易懂,因为它是大多数人都知道的javascript基础。当前的大多数web应用程序都倾向于使用angular js和主干,使用节点很容易与客户端代码交互,因为两者都将使用json数据。有很多插件可用。

缺点:-

节点将支持大多数数据库,但最好的是mongodb,它不支持复杂的连接和其他。编译错误。。。开发人员应该以其他方式处理每一个异常,如果任何error accord应用程序将停止工作,我们需要再次手动或使用任何自动化工具启动它。

结论:-Nodejs最适合用于简单和实时应用程序。。如果您有非常大的业务逻辑和复杂的功能,最好不要使用nodejs。如果您想构建一个应用程序以及聊天和任何协作功能。。节点可以用在特定的部件中,并保留下来。

做石棉长内裤。。。

昨天我的标题是Packt Publications,Reactive Programming with JavaScript。它实际上不是一个以Node.js为中心的标题;前几章旨在涵盖理论,后几章则涉及实践。因为我真的认为不给读者一个Web服务器是不合适的,所以Node.js似乎是最明显的选择。案件甚至在开庭前就已结案。

我本可以对我使用Node.js的经历给出一个非常乐观的看法。相反,我诚实地讲述了我遇到的好点和坏点。

让我在这里引用几句相关的话:

警告:Node.js及其生态系统很热——热到足以让你严重烧伤!当我还是一名数学助教时,有人告诉我一个不明显的建议,那就是不要告诉学生什么是“容易的”。回想起来,原因有点明显:如果你告诉人们什么是容易的,没有找到解决方案的人可能会觉得(甚至更)愚蠢,因为他们不仅不知道如何解决问题,但他们太愚蠢而无法理解的问题很简单!Python/Django中的一些陷阱不仅会惹恼来自Python/Django的人,如果你做了任何更改,它会立即重新加载源代码。对于Node.js,默认行为是,如果您进行了一次更改,旧版本将继续处于活动状态,直到时间结束或手动停止并重新启动服务器。这种不恰当的行为不仅惹恼了蟒蛇爱好者;这也激怒了提供各种变通方法的本地Node.js用户。StackOverflow问题“在Node.js中自动重新加载文件”在撰写本文时获得了超过200个赞成票和19个答案;编辑会将用户引导到保姆脚本、节点主管,主页位于http://tinyurl.com/reactjs-node-supervisor.这个问题为新用户提供了很大的机会,让他们觉得自己很愚蠢,因为他们认为自己已经解决了这个问题,但旧的错误行为完全没有改变。而且很容易忘记跳出服务器;我已经做过多次了。我想传达的信息是, “不,你并不傻,因为Node.js的这种行为让你背上了背;只是Node.js设计人员认为没有理由在这里提供适当的行为。请尝试应对它,也许可以从节点主管或其他解决方案那里获得一些帮助,但请不要觉得自己很傻。你不是有问题的人;问题是Node.js默认的行为。”经过一番辩论后,这一部分被保留了下来,正是因为我不想给人一种“这很容易”的印象。我在工作时反复剁手,我不想克服困难,让你相信让Node.js及其生态系统正常运行是一件简单的事,如果这对你来说也不简单,你不知道你在做什么。如果您在使用Node.js时没有遇到令人讨厌的困难,那就太好了。如果你这样做了,我希望你不要走开时觉得,“我很傻,一定是我出了什么问题。”如果你在处理Node.js时遇到了令人讨厌的意外,那你就不傻了。不是你!这是Node.js及其生态系统!

在最后几章和结论中,我并不真正想要附录,它讲述了我在生态系统中找到的东西,并为愚蠢的文学主义提供了一个变通方法:

另一个看起来非常适合的数据库,也可能是可赎回的,是HTML5键值存储的服务器端实现。这种方法具有API的主要优势,大多数优秀的前端开发人员都非常了解该API。就这一点而言,它也是大多数不太好的前端开发人员都足够理解的API。但是对于节点localstorage包,虽然不提供字典语法访问(您希望使用localstorage.setItem(key,value)或localstorage.getItem(key),而不是localstorage[key]),但实现了完整的localstorage语义,包括默认的5MB配额,为什么?服务器端JavaScript开发人员是否需要自我保护?对于客户端数据库功能,每个网站5MB的配额确实是一个巨大而有用的喘息空间,可以让开发人员使用它。您可以设置一个低得多的配额,并且仍然可以为开发人员提供比蹒跚学步和cookie管理更大的改进。5MB的限制对大数据客户端处理来说并不是很快,但有一个非常慷慨的空间,足智多谋的开发人员可以利用它做很多事情。但另一方面,在最近购买的大多数磁盘中,5MB并不是一个特别大的部分,这意味着如果您和某个网站对磁盘空间的合理使用存在分歧,或者某个网站过于贪婪,那么这并不会给您带来太大的成本,除非您的硬盘已经太满,否则您不会面临被淹没的危险。如果平衡稍微少一点或多一点,也许我们会更好,但总体而言,这是解决客户端环境内在紧张的一个不错的解决方案。然而,可能需要指出的是,当您是为服务器编写代码的人时,您不需要任何额外的保护,以免数据库的大小超过可容忍的5MB。大多数开发人员既不需要也不希望工具充当保姆,保护他们存储超过5MB的服务器端数据。5MB的配额是客户端的黄金平衡,在Node.js服务器上有点傻。(而且,对于本附录所述的多个用户的数据库,可能会有点痛苦地指出,除非您在磁盘上为每个用户帐户创建一个单独的数据库,否则每个用户帐户的容量不是5MB;这是所有用户帐户共享的5MB。如果您病毒传播,这可能会很痛苦!)文档中指出,配额是可定制的,但一周前发给开发者的一封电子邮件,询问如何更改配额,这封邮件没有得到回复,StackOverflow的问题也是如此。我能找到的唯一答案是在Github CoffeeScript源代码中,它被列为构造函数的可选第二个整数参数。所以这很简单,您可以指定一个等于磁盘或分区大小的配额。但是,除了移植一个没有意义的特性之外,该工具的作者还完全没有遵循一个非常标准的惯例,即将0解释为变量或函数的“无限”,其中整数将指定某些资源使用的最大限制。处理此错误功能的最佳方法可能是指定配额为无限:

if (typeof localStorage === 'undefined' || localStorage === null)
  {      
  var LocalStorage = require('node-localstorage').LocalStorage;
  localStorage = new LocalStorage(__dirname + '/localStorage',
    Infinity);
  }

按顺序交换两个注释:

人们不必要地不断使用JavaScript作为一个整体来攻击自己的脚,而JavaScript成为一种值得尊敬的语言的一部分,正如道格拉斯·克罗克福德(Douglas Crockford)所说,“JavaScript作为一种语言,有一些真正好的部分,也有一些真正坏的部分。这里有好的部分。请忘记其他任何东西。“也许炙手可热的Node.js生态系统会发展出自己的”Douglas Crockford“,他会说,”Node.js的生态系统是一个编码狂野的西部,但有一些真正的宝石可以找到。这里有一个路线图。这里有一些几乎不惜任何代价都可以避免的领域。这里有任何语言或环境中都可以找到的一些最有钱的领域。”也许其他人可以把这些话当作一个挑战,跟随克罗克福德的领导,为Node.js及其生态系统写下“好的部分”和/或“更好的部分”。我会买一本!考虑到所有项目的热情程度和纯粹的工作时间,可能需要在一年、两年或三年内对本文撰写时关于不成熟生态系统的任何言论进行严厉的批评。五年后说:“2015年Node.js生态系统有几个雷区。2020年Node.jss生态系统有多个天堂。”

没有什么比银弹更棒的了。每件事都伴随着一些相关的成本。就好像你吃了油腻的食物,你会损害你的健康,而健康的食物不会像油腻的食物一样含有香料。无论他们想要健康还是食物中的香料,都是个人的选择。Node.js考虑在特定场景中使用的方式相同。如果你的应用程序不适合这种情况,你就不应该在你的应用开发中考虑它。我只是把我的想法放在同一点上:

何时使用Node.JS

如果服务器端代码需要很少的cpu周期。在另一个世界中,您正在执行非阻塞操作,并且没有消耗大量CPU周期的繁重算法/作业。如果您来自Javascript后台,并且能够像客户端JS一样轻松编写单线程代码。

何时不使用Node.JS

您的服务器请求取决于消耗大量CPU的算法/作业。

Node.JS的可扩展性考虑

Node.JS本身并没有利用底层系统的所有核心,默认情况下它是单线程的,您必须自己编写逻辑以利用多核心处理器并使其成为多线程的。

Node.JS替代方案

还有其他选项可以代替Node.JS,但Vert.x似乎很有前途,并且有很多其他功能,如多边形和更好的可扩展性考虑。