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,另一个针对页面图标(通常称为网站图标)。如果你想忽略页面图标请求,你可以像这样添加一个 if
块 if (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 中,字符串转换会自动进行。
我写了一些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,另一个针对页面图标(通常称为网站图标)。如果你想忽略页面图标请求,你可以像这样添加一个 if
块 if (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 中,字符串转换会自动进行。