我写了一些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);
答案 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);
})
因此,每次打开新标签/窗口时,您的计数都会增加两倍。不幸的是,我不确定为什么会根据您使用的浏览器进行更改。