Node.js现在似乎在书呆子博客中获得了很多专栏,并且通过一些功课,不难看出原因。
在深入学习节点之前有什么好处?我假设Javascript,但任何其他技术或概念会有所帮助吗?从本地测试到生产服务器需要知道什么?
答案 0 :(得分:8)
Node.js是一个事件驱动的系统,所以你要写的很多代码都是异步的。这意味着你经常无法编写像
这样的代码if( something() )
{
somethingElse();
}
你必须做类似的事情
something(function(result){
if(result){
somethingElse();
}
})
(假设something()
是一个异步函数,例如一个不返回其结果而是导致回调(匿名函数)一旦完成就调用其结果的函数)
这被称为Continuation Passing Style (CPS),是您有效使用Node.js所需的最大障碍之一。
这是关于CPS的另一个更实用的文章:http://matt.might.net/articles/by-example-continuation-passing-style/
答案 1 :(得分:5)
如果您正在构建一个vanilla请求/响应Web应用程序,那么基础知识将是:
http服务器示例在节点世界中非常常见,因为与其他Web语言(如php)不同,您的节点应用程序并非生活在apache Web服务器之类的“内部”。您实际上是在创建一个可以根据请求返回响应的工作Web服务器。它是一种组织程序的一种不同的方式,而不是典型的“坚持你的html / php / apache的web根目录中的任何文件”而去。节点的优势在于它需要创建一个web / tcp / udp / cli服务器,使许多令人讨厌的硬件如线程池,事件循环,锁等等变得无足轻重。
因为您将不得不以更加手动的方式处理这些事情(至少在您编写模块或选择模块来处理它之前)。我通过电话采访的许多候选人无法为我定义典型语言如何处理会话商店的内部工作方式。他们只知道他们将值X粘贴在变量Y中并且在会话期间可用。实际上,有一个cookie被设置为按会话ID引用文件/数据库/任何商店。在节点中,您自己从http标头中提取这些值(或模块为您执行此操作),并在http的更基本构建块之上构建。 POST和GET数据也是如此。
话虽这么说,你可以使用像express这样的框架 - http://expressjs.com/ - 效果很好,它会为你处理很多事情。但是,它仍然足够原始(大多数节点人员更喜欢imo),你可以在http请求的内部获得。
大多数Web应用程序都需要某种数据库。像mysql这样的关系型数据库是解决这个问题的一种方式 - 许多节点工具更喜欢像mongodb这样的东西,因为它给了他们更多的自由,比如模式+迁移,以及更多的javascript感觉(因为事情看起来像JSON)。幸运的是,由于社区拥有许多用于公共数据库的客户端库,因此您不必做出艰难而快速的选择。
正如其他人提到的那样,这可能会在一定程度上打击你的思想。在许多其他语言中,除非您使用特定的非阻塞框架(如python中的twisted或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这样的流控制库 - 它们提供了对这些操作进行排序的工具,因此你的代码看起来并不可笑。
显然这是一个广泛的问题。我个人认为你应该潜入并全力以赴。它实际上是学习这个东西的好方法。
答案 2 :(得分:2)
显然(正如你已经说过的)JavaScript作为一种语言。我建议使用Eloquent Javascript作为JavaScript的精彩指南。
答案 3 :(得分:1)
好吧,既然node.js提升了JavaScript来让你编写全面的服务器应用程序,你可能希望熟悉面向对象的技术:
这将让您整理代码: - )