NodeJS如何运行的概念以及每个请求的空间

时间:2012-05-16 06:41:02

标签: node.js

我一直在修补NodeJS一段时间。我似乎还不明白Node实际上是如何运行的。也许只是因为我无法摆脱PHP思维模式。我知道它与PHP有很大的不同,但我仍然无法理解这个想法 - 特别是当他们不断重复术语事件循环事件驱动 REPL

  • 代码启动时“永远”运行吗?是喜欢后端的一个大型浏览器窗口,所有客户端都在看并且会监听某种 onRequest 来自他们的事件?

  • 或者每个请求都是一个孤立的沙箱?代码是否针对每个请求运行,与其他请求分开?

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

3 个答案:

答案 0 :(得分:1)

  1. 节点代码不需要永远运行。您看到的典型用例使用Node作为http服务器(顺便说一下,它是Node的卖点之一;大约5行代码中的基本http服务器)因此永远运行。
  2. 个别请求被隔离,因为它们在回调中被处理或响应。回调使用一个名为闭包的概念,它确保在调用回调时保持回调的状态。所以每个响应都是一个回调,它会持续它的状态。 Here's关于闭包和回调的一个很好的链接。
  3. 这些回调以异步方式运行,因此主事件循环可以自由处理进一步的请求。

答案 1 :(得分:0)

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

你称之为'代码'是什么?启动http服务器后,通过调用listen函数,是的,它会永远运行,直到你终止进程。

或者每个请求都是一个孤立的沙箱?代码是否针对每个请求运行,与其他请求分开?

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

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

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

答案 2 :(得分: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吗?)。