节点JS设置页面抛出空白页面

我正在尝试使节点js服务器和客户端安装程序使用socket.io( Daniel Nill教程)

我在同一个目录server.jssocket.html有两个文件。

server.js

 var http = require("http"); var url = require('url'); var fs = require('fs'); var server = http.createServer(function(request, response){ console.log('Connection'); var path = url.parse(request.url).pathname; console.log(path); switch(path){ case '/': response.writeHead(200, {'Content-Type': 'text/html'}); response.write('hello world'); break; case '/socket.html': console.log("Path: " + __dirname + path); fs.readFile(__dirname + path, function(error, data){ if (error){ response.writeHead(404); response.write("Error 1: opps this doesn't exist - 404"); console.log("With Error"); }else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write(data, "utf8"); console.log("Without Error"); } }); break; default: response.writeHead(404); response.write("Error 2: opps this doesn't exist - 404"); break; } response.end(); }); server.listen(8001); 

socket.html

 <html> <head>This is the title</head> <body>This is our socket.html file</body> </html> 

terminal显示这个输出

 MacBook-Pro:nodejs ptamzz$ node server.js Connection /socket.html Path: /Users/ptamzz/Documents/nodejs/socket.html Without Error 

但是当我尝试访问http://localhost:8001/socket.html ,浏览器会抛出一个空白页面。

根据我的理解,我不假设得到的HTML文件socket.html的内容作为console.log("Without Error")显示?

发生这种情况是因为在/socket.htmlpath中使用asynchronous方法( fs.readFile ),并在调用response.end()调用callback。 所以你首先结束响应,然后在节点完成读文件的10ms内说,你调用response.write(data, "utf8");

为了解决这个问题, response.write(data, "utf8");