0

我一直在修补 NodeJS 一段时间。我似乎仍然不明白 Node 是如何运行的。也许只是我无法摆脱 PHP 的心态。我知道它与 PHP 有很大不同,但我仍然无法理解这个想法——尤其是当他们不断重复术语event-loopevent-drivenREPL时。

  • 代码在启动时是否“永远”运行?是不是就像后端的一个大浏览器窗口一样,所有客户端都在查看它并从他们那里监听某种onRequest事件?

  • 还是每个请求都是一个孤立的沙箱?每个请求的代码在哪里运行,与其他请求分开?

我在视频中看到了套接字连接聊天的演示,它看起来就像第一点描述的那样运行。但是,如果所有人都访问同一个“空间”,那不是很“奇怪”吗?

4

3 回答 3

1
  1. 节点代码不需要永远运行。您看到的典型用例使用 Node 作为 http 服务器(顺便说一下,这是 Node 的卖点之一;大约 5 行代码的基本 http 服务器),因此可以永远运行。
  2. 单个请求是孤立的,因为它们在回调中被处理或响应。回调使用称为闭包的概念,可确保在调用回调时保持回调的状态。因此,每个响应都是一个保持其状态的回调。这是一个关于闭包和回调的好链接。
  3. 这些回调异步运行,因此主事件循环可以自由处理进一步的请求。
于 2012-05-16T07:12:01.917 回答
0

代码在启动时是否“永远”运行?是不是就像后端的一个大浏览器窗口一样,所有客户端都在查看它并从他们那里监听某种 onRequest 事件?

您将什么称为“代码”?一旦你启动了一个http服务器,通过调用listen函数,是的,它会永远运行,直到你终止进程。

还是每个请求都是一个孤立的沙箱?每个请求的代码在哪里运行,与其他请求分开?

每个传入的请求(HttpGet、HttpPost)都在一个函数中处理。为了简单起见,我不会使用术语回调。该函数是一个非阻塞异步函数。在 Javascript 中,所有函数都是一种孤立的沙箱,但它们可以访问全局变量。

http.createServer(onRequest).listen(80);
var xvz;
function onRequest() {
 var abc;
}

在上面的代码片段中,abc 位于一个隔离的沙箱中。但是,abc 仍然可以访问 xyz。

于 2012-07-20T09:55:58.343 回答
0

您的代码生成的程序是持久的。正如您所描述的,它就像一个旧的大浏览器窗口,接收请求并回复它们。

阅读以下示例。

var http = request("http");
var shared = 1;

function procreq (req, res)
{
    var notshared = 1;
    res.writeHead(200, { "Content-Type": "text/plain" });
    res.end(String(shared++) +  ', ' + String(notshared++));
}

var server = http.createServer(procreq);
server.listen(8080);

通过运行该服务器示例,您可以看到程序是如何持久化的,并且该shared变量对所有请求都是可见的,它是一个真正的服务器共享变量。我认为,如果我没记错的话,在 PHP 中你可以使用 memcached(或者它是 APC?)来实现这一点。

于 2012-10-25T12:48:35.447 回答