节点JS设置页面抛出空白页面
我正在尝试使节点js服务器和客户端安装程序使用socket.io( Daniel Nill教程)
我在同一个目录server.js
& socket.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.html
path中使用asynchronous方法( fs.readFile
),并在调用response.end()
调用callback。 所以你首先结束响应,然后在节点完成读文件的10ms内说,你调用response.write(data, "utf8");
。
为了解决这个问题, response.write(data, "utf8");