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

时间:2016-07-09 00:15:57

标签: javascript node.js google-chrome counting

我写了一些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);

2 个答案:

答案 0 :(得分:1)

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

console.log(req.url);

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

请求页面图标的确切位置是特定于浏览器的,因此在这种情况下,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中,字符串转换会自动发生。

答案 1 :(得分:0)

您的计数增加了一倍,因为您在服务器中间件中增加了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);
})

因此,每次打开新标签/窗口时,您的计数都会增加两倍。不幸的是,我不确定为什么会根据您使用的浏览器进行更改。