连接到socket.io服务器时,Web浏览器永远不会停止“加载”?

我有一个socket.io的问题。 我有一个nodejs服务器作为一个networking服务器,同时也运行一个socket.io服务器。 另外我有一个连接到socket.io服务器的网页。 网页上有一个button,点击后会发出时间更新请求。 然后,socket.io服务器将以毫秒为单位的时间发送回网页,然后更新div以显示时间。

这工作得很好,但是,我注意到我的networking浏览器(Chrome)的选项卡中有旋转加载图标,并像网页从未完全加载。 它还显示“X”停止加载页面。

如果我点击'X'停止加载页面,我的软件继续工作正常,但我不明白为什么页面从未完全加载。

服务器代码:

var http = require("http"); var wrHandler = require("./webRequestHandler"); var io = require("socket.io"); var parser = require("./messageParser"); function start() { function onRequest(request, response){ wrHandler.handle(request, response); } var webserver = http.createServer(onRequest).listen(8888); console.log("Server has started."); var ioserver = io.listen(webserver); ioserver.set('log level', 3); ioserver.sockets.on('connection', function(socket){ parser.parse(socket); }); } exports.start = start; 

Web请求处理程序:

 var url = require("url"); var fs = require("fs"); function handle(request, response){ var pathname = url.parse(request.url).pathname; console.log(pathname); switch(pathname){ case '/': fs.readFile("../html/index.html", function(error, data){ if(error){ response.writeHead(404); response.write("This file does not exist."); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write(data, "utf8"); } }); break; default: fs.readFile("../html" + pathname, function(error, data){ if(error){ response.writeHead(404, {"Content-Type": "text/html"}); response.write("<html><body>This file does not exist!</body></html>"); console.log("Test"); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write(data, "utf8"); } }); } } exports.handle = handle; 

消息parsing器:

 function parseMessage(socket){ socket.on('client_msg',function(data){ var msgID = data.msgID; switch(msgID){ case "gettime": socket.emit('timeupdate', {"time": new Date().getTime()}); break; default: break; } }); } exports.parse = parseMessage; 

HTML页面:

 <html> <head> <script src="/socket.io/socket.io.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script> <script> var socket = io.connect(); function getTime(){ socket.emit('client_msg', {"msgID": "gettime"}); } socket.on('timeupdate', function(data){ $("#time").text(data.time); }); </script> </head> <body> <input type="button" value="Get Server Time" onclick="getTime()"/> <div id="time"> </div> </body> </html> 

我应该承认,我对node.js非常新,也不是最强大的javascript开发者。 任何批评/build议/提示,不胜感激。

在您的Web请求处理程序中, 最后,在您的开关块外部执行response.end()。

编辑:您必须在每次写入结束时执行此操作,因为您正在读取asynchronous文件。 如果你使用readFileSync,你可以在最后写一次。

http://nodejs.org/api/http.html#http_response_end_data_encoding

所以你的文件看起来像这样:

  var url = require("url"); var fs = require("fs"); function handle(request, response){ var pathname = url.parse(request.url).pathname; console.log(pathname); switch(pathname){ case '/': fs.readFile("../html/index.html", function(error, data){ if(error){ response.writeHead(404); response.write("This file does not exist."); response.end(); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write(data, "utf8"); response.end(); } }); break; default: fs.readFile("../html" + pathname, function(error, data){ if(error){ response.writeHead(404, {"Content-Type": "text/html"}); response.write("<html><body>This file does not exist!</body></html>"); response.end(); console.log("Test"); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write(data, "utf8"); response.end(); } }); } } exports.handle = handle; 

请注意,response.end('foo'); 相当于response.write('foo'); 到Response.End();

此外,我知道这是一个有点题外话,但你应该尝试节点的expression框架。 这使得很多web请求处理容易,而不是过分自以为是。