1

我是 Node.js 的新手。我刚刚编写了一个 http 服务器模块,其中包含一个计数变量,用于存储模块接收到 http 请求的次数:

var http = require("http");
var count = 0; //no of requests so far

function start() {  
  function onRequest(request, response) {
    console.log(count + ": Request received in Main Server");
    count++;
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello! you are request no. " + count);
    response.end();     
  }

  http.createServer(onRequest).listen(8888);
  console.log("Main Server has started.");
}

function getCount() {
    return count;
}  

exports.getCount = getCount;
exports.start = start;

然后我写了另一个服务器,我们称之为 test.js 启动服务器模块,但同时在另一个端口上监听 http 请求,比如说 8889。 test.js 应该显示 server.js 的请求数服务至今。

var http = require("http");
 var server = require("./server");
 server.start();

 function onRequest(request, response) {
    console.log("Request received in Test Server");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello! Server app has served: " + server.getCount());
    response.end();
  }

  http.createServer(onRequest).listen(8889);
  console.log("Test Server has started.");

当我运行 test.js 并向 server.js ( http://localhost:8888) 发出请求时,它会增加计数。(我每次都收到双重请求,当我在某处阅读时,这是由于浏览器发送另一个请求来获取 favicon.ico,好吧,好吧,这不是我的问题)。我的问题是,当我向 test.js ( ) 发送请求时http://localhost:8889,我总是会收到我已经向 server.js 发出的请求数量加上一个额外的请求!换句话说,如果http://localhost:8888显示我 1,http://localhost:8889它从我的服务器模块读取相同的值显示 2!

任何人都知道为什么会这样?提前致谢!

4

1 回答 1

1

当您从浏览器点击刷新时,请求通常(我相信总是,在 Chrome 中我知道它总是,在其他浏览器中不确定)按以下顺序发出:

yourdomain.com/

其次是

yourdomain.com/favicon.ico

因此,您在第一次请求后显示计数。然后请求您的网站图标,这会增加您的计数值。如果您从浏览器发出请求,您将永远不会在两个窗口中看到相同的值,因为在您能够请求 8889 端口之前,您的 favicon 请求总是会出现。我想,理论上是可以的。如果您可以在 X 毫秒内刷新两个窗口,您可以在请求图标之前 ping 8889,但是如果您在本地计算机上工作,那么这个毫秒数会太小以至于不可能。

如果你想验证这一点,你可以做一个简单的检查,如下所示:

if(request.url.match(/favicon.ico/i) === false) count++;

这应该使您的计数无法更新网站图标请求。

于 2013-09-03T15:13:18.413 回答