我对这类东西很陌生,但最近我听到了很多关于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等强大的王者。我知道这确实取决于一个人对语言的专业知识,但我的问题更多地属于一般范畴:什么时候使用特定的框架,它特别适合什么类型的问题?
做石棉长内裤。。。
昨天我的标题是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生态系统有多个天堂。”
最适合并发请求处理的节点-
那么,让我们从一个故事开始。在过去的两年里,我一直致力于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的节点方式。
做石棉长内裤。。。
昨天我的标题是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特别适合那些希望保持浏览器与服务器之间持久连接的应用程序。使用称为“长轮询”的技术,您可以编写一个实时向用户发送更新的应用程序。在Ruby on Rails或Django等网络巨头上进行长时间的轮询会给服务器带来巨大的负载,因为每个活动客户端都会消耗一个服务器进程。这种情况相当于停机坪袭击。当您使用Node.js之类的东西时,服务器不需要为每个打开的连接维护单独的线程。
这意味着您可以在Node.js中创建一个基于浏览器的聊天应用程序,它几乎不需要系统资源就可以为大量客户机提供服务。任何时候你想做这种长轮询,Node.js都是一个很好的选择。
值得一提的是,Ruby和Python都有做这类事情的工具(分别是eventmachine和twisted),但Node.js从一开始就做得非常好。JavaScript非常适合基于回调的并发模型,并且在这里表现出色。此外,能够使用客户端和服务器上的JSON进行序列化和反序列化是非常不错的。
我期待着在这里阅读其他答案,这是一个很棒的问题。
值得指出的是,Node.js也非常适合在客户机/服务器之间重用大量代码的情况。Meteor框架使这变得非常简单,许多人都认为这可能是web开发的未来。根据经验,我可以说在Meteor中编写代码非常有趣,其中很大一部分是花更少的时间思考如何重组数据,这样浏览器中运行的代码就可以轻松地处理数据并将其传递回去。
这是一篇关于金字塔和长轮询的文章,事实证明,在gevent:TicTacToe和长轮询与金字塔的帮助下,这很容易设置。
如果您的应用程序主要使用webapi或其他io通道,提供或接受用户界面,node.js可能是您的最佳选择,特别是如果您想最大限度地发挥可伸缩性,或者如果您的主要语言是javascript(或javascript转译器)。如果您构建微服务,node.js也可以。Node.js也适用于任何小型或简单的项目。
它的主要卖点是让前台人员负责后端工作,而不是典型的分工。另一个合理的卖点是,如果您的员工从一开始就面向javascript。
然而,超过某一点后,如果没有强制模块化、可读性和流控制的可怕技巧,就无法扩展代码。尽管有些人喜欢这些黑客,尤其是来自事件驱动的javascript背景,但他们似乎很熟悉或可以原谅。
特别是,当您的应用程序需要执行同步流时,您会开始使用半生不熟的解决方案,这会大大降低开发过程的速度。如果应用程序中有计算密集型部分,请谨慎选择(仅)node.jshttp://koajs.com/与我最初使用node.js或编写这篇文章时相比,其他新奇之处减轻了这些原本棘手的方面。