chrome 浏览器显示 nodejs 代码的计数错误

chrome browser shows counting error for nodejs code

我写了一些nodejs代码。在执行过程中,我注意到第一次访问的 chrome 浏览器显示值为 1 的计数,然后对于之后的访问,它显示 3、5、9 等等。 Internet Explorer 浏览器工作正常,我的意思是,它显示 1、2、3 等等。我不明白这是为什么。我写的代码附在下面。我的代码哪里出错了?

感谢您的帮助。

var http = require('http');
var socket = require('socket.io')();
var port = process.env.port || 1337;
var count = 0;
var x = 0;
socket.on('connection', function (client) {
    count++;
    console.log("soc con");
    client.broadcast({ count: count })
    client.on('disconnect', function () {
        count--;
        console.log("soc dis");
    });
    console.log(count);
})

http.createServer(function (req, res) {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    count++;
    var c = count.toString();
    res.end(c);
}).listen(port);

您的计数加倍了,因为您在服务器中间件

中增加了 count
function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  //here
  count++;
  var c = count.toString();
  res.end(c);
})

和你的套接字连接

socket.on('connection', function (client) {
  //here
  count++;
  console.log("soc con");
  client.broadcast({ count: count })
  client.on('disconnect', function () {
    count--;
    console.log("soc dis");
  });
  console.log(count);
})

因此,每次您打开一个新的 tab/window,您的计数都会增加两次。不幸的是,我不确定为什么这会根据您使用的浏览器而改变。

当浏览器连接到网页时,它们通常会请求您请求的页面,并且它们会请求该页面的图标(称为网站图标)。这是对同一服务器的两个请求。如果您添加:

console.log(req.url);

对于您的服务器处理程序,您会看到您收到针对每个浏览器页面的两个请求,一个针对页面的 URL,另一个针对页面图标(通常称为网站图标)。如果你想忽略页面图标请求,你可以像这样添加一个 ifif (req.url === "/") { code here} 来避免任何其他 URL 请求并且只增加特定页面的计数器。

请求页面图标的具体方式是特定于浏览器的,因此在这种情况下,IE 的行为肯定可能与 Chrome 不同。

将您的服务器更改为:

http.createServer(function (req, res) {
    if (req.url === '/') {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        count++;
        res.end(count);
    } else {
        res.statusCode = 404;
        res.end();
    }
}).listen(port);

仅供参考,您可以替换为:

var c = count.toString();
res.end(c);

有了这个:

res.end(count);

在 Javascript 中,字符串转换会自动进行。