7

Node.js 似乎现在在 nerd 博客中获得了很多列英寸,并且通过一些家庭作业不难看出原因。

在深入学习节点之前需要了解什么?我假设是 Javascript,但还有其他有用的技术或概念吗?从本地测试到生产服务器我需要知道什么?

4

4 回答 4

8

Node.js 是一个事件驱动的系统,因此您将编写的很多代码都是异步的。这意味着您经常无法编写类似的代码

if( something() ) 
{ 
    somethingElse(); 
}

你必须做类似的事情

something(function(result){ 
     if(result){ 
         somethingElse(); 
     }
})

(假设something()是一个异步函数,例如一个不返回其结果而是导致回调(匿名函数)在其完成后调用其结果的函数)

这被称为延续传递风格 (CPS),是您有效使用 Node.js 所需要克服的最大障碍之一。

这是关于 CPS 的另一篇更实用的文章:http: //matt.might.net/articles/by-example-continuation-passing-style/

于 2011-05-24T12:20:52.663 回答
5

如果您正在构建一个普通的请求/响应 Web 应用程序,那么基础知识将是:

http/s 的一般工作原理

http 服务器示例在节点世界中非常常见,因为与其他 Web 语言(如 php)不同,您的节点应用程序并不存在于 apache Web 服务器等“内部”。您实际上是在创建一个工作 Web 服务器,它将根据请求返回响应。它是一种组织程序的方式,与典型的“将你的 html/php/whatever 文件粘贴到 apache 的 web 根目录中”并继续前进的方式大不相同。节点的一个优点是它需要像创建一个 web/tcp/udp/cli 服务器这样的东西来简化许多讨厌的困难部分,如线程池、事件循环、锁等。

会话/cookies/POST+GET

因为您将不得不以更手动的方式处理这些事情(至少在您编写一个模块或选择一个模块来处理它之前)。我电话面试的许多候选人无法为我定义典型语言如何处理他们的会话存储的内部运作方式。他们只知道他们将值 X 保存在变量 Y 中,并且在会话期间可用。实际上,有一个 cookie 被设置,它通过会话 id 引用文件/数据库/任何存储在某处的东西。在 node 中,您自己从 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' 在结果之前打印。

当您必须执行许多相互依赖的同步操作时,这可能会变得很棘手。当您到达这一点时,是时候研究像https://github.com/caolan/async这样的流控制库了——它们提供了用于对这些操作进行排序的工具,这样您的代码就不会看起来嵌套得可笑。

显然这是一个广泛的问题。就个人而言,我认为你应该潜入并试一试。它实际上是学习这些东西的好方法。

于 2011-05-24T22:30:46.797 回答
2

显然(正如您已经说过的)JavaScript 作为一种语言。我推荐Eloquent Javascript作为 JavaScript 的一个很好的指南。

于 2011-05-24T12:45:38.047 回答
1

好吧,由于 node.js 提升了 JavaScript 以让您编写完整的服务器应用程序,您可能希望熟悉面向对象的技术:

  • 原型
  • 控制范围的自执行方法
  • JSON

这将让你组织你的代码:-)

于 2011-05-24T12:20:57.127 回答