问题描述
|
现在,Node.js似乎在书呆子博客中占据了很大的篇幅,并且有了一点功课,不难理解为什么。
深入学习节点之前,有什么好知道的?我假设使用Javascript,但是还有其他技术或概念会有所帮助吗?从本地测试到生产服务器,我需要知道什么?
解决方法
如果您要构建普通的请求/响应Web应用程序,则基础知识是:
http / s一般如何工作
http服务器示例在节点世界中非常常见,因为与另一种Web语言(例如php)不同,您的节点应用程序不在“内部” Apache Web服务器等中。您实际上是在创建一个可工作的Web服务器,该服务器将根据请求返回响应。与典型的“将您的html / php /任何文件粘贴在apache的Web根目录中”并走下去,这是一种组织程序的方式。节点的优势在于,它需要像创建Web / tcp / udp / cli服务器之类的东西来琐碎许多讨厌的硬部分,例如线程池,事件循环,锁等。
会话/ Cookie / POST + GET
因为您将不得不以更手动的方式处理这些问题(至少直到编写模块或选择要处理的模块为止)。我接受电话采访的许多应聘者无法为我定义典型语言如何处理其会话存储的内部运作方式。他们只知道将值X保留在变量Y中,并且在会话期间一直可用。实际上,有一个cookie被设置为通过会话ID引用文件/数据库/任何存储在某个地方的cookie。在node中,您可以自己从HTTP标头中拉出这些值(或由模块为您完成),并以更基本的http构建块为基础。 POST和GET数据也是如此。
话虽如此,您可以使用像express这样的框架-http://expressjs.com/-发挥很大的作用,它将为您处理很多事情。但是,它仍然足够原始(大多数节点用户更喜欢imo),您可以从http请求的内部获取它。
坚持不懈
大多数Web应用程序将需要某种数据库。像mysql这样的关系数据库是解决此问题的一种方法-许多节点用户喜欢mongodb之类的东西,因为它为它们提供了更多自由,如模式+迁移之类的东西,以及更多的javascript感觉(因为事物看起来像JSON)。幸运的是,您不必做出艰难而快速的选择,因为社区中有许多通用数据库的客户端库。
非阻塞方法
正如其他人提到的那样,这可能会在一定程度上让您大吃一惊。在许多其他语言中,除非您使用特定的非阻塞框架,例如python中的twist或ruby中的eventmachine,否则您将编写几乎在所有情况下都是同步的代码。这意味着,当您向数据库查询信息时,您将像这样进行操作:
result = query(\"SELECT * FROM users\");
console.log(results);
console.log(\"howdy\");
相反,在节点(或其他支持基于回调/事件的io的框架)中,您可能会编写如下代码:
query(\"SELECT * FROM users\",function(result){
// Do something with your users
console.log(result);
});
console.log(\"howdy\");
在第一个示例中(来自同步世界),'howdy \'将在结果后打印。在第二个(异步)示例中,在结果之前打印“ howdy”。
当您必须执行许多彼此依赖的同步操作时,这可能会变得棘手。到此为止,是时候来研究流控制库了,例如https://github.com/caolan/async -它们提供了对这些操作进行排序的工具,因此您的代码看起来不会显得可笑地嵌套。
显然,这是一个广泛的问题。就我个人而言,我认为您应该潜入其中并进行旋转。这实际上是学习这些东西的好方法。
,Node.js是一个事件驱动的系统,因此您将编写的许多代码都是异步的。这意味着您经常无法编写类似
if( something() )
{
somethingElse();
}
您必须做类似的事情
something(function(result){
if(result){
somethingElse();
}
})
(假设ѭ4是一个异步函数,例如,一个不返回结果,而是在完成后导致使用其结果调用回调(匿名函数)的函数)
这就是所谓的连续传递样式(Continuation Passing Style,CPS),这是您克服有效使用Node.js所需的最大障碍之一。
这是关于CPS的另一篇更实用的文章:http://matt.might.net/articles/by-example-continuation-passing-style/
,显然(正如您已经说过的)JavaScript是一种语言。我推荐Eloquent Javascript作为JavaScript的绝佳指南。
,好吧,由于node.js提升了JavaScript的功能,使您可以编写完整的服务器应用程序,因此您可能需要熟悉面向对象的技术:
原型
自我控制范围的方法
JSON格式
这将使您组织代码:-)