【发布时间】:2014-09-21 12:35:54
【问题描述】:
我正在编写一个带有 socket.io 实现的简单 node.js 服务器。当我去 mylocalip:8005/socket.html 'socket_break' 在控制台中的 'socket_data' 之前打印。所以我在浏览器中看到的是空白页而不是 socket.html 的内容。
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;
switch(path){
case '/':
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('hello world');
break;
case '/socket.html':
fs.readFile('./socket.html', function(error, data){
if (error){
response.writeHead(404);
response.write("opps this doesn't exist - 404");
console.log('socket_error');
}
else{
response.writeHead(200, {"Content-Type": "text/html"});
response.write(data, "utf8");
console.log('socket_data');
}
});
console.log('socket_break');
break;
default:
response.writeHead(404);
response.write("opps this doesn't exist - 404");
break;
}
response.end();
});
server.listen(8005);
如何在读取文件之前防止开关/大小写中断并使浏览器显示我的 socket.html 文件的内容?
【问题讨论】:
-
错误不应该在那个级别处理,它应该发生在你之前,甚至在你到达路线之前。那时你可以这样做:
var fileStream = fs.createReadStream('socket.html');fileStream.pipe(response); -
问题是你甚至在 readFile 完成之前就结束了响应。最简单的解决方案是将
response.end移动到您的案例语句中,并在/socket.html的情况下移动到readFile中。这意味着大量的代码重复。如果您不希望这样,您可能想要更改@Robert 在他的回答中提到的架构。
标签: javascript html node.js socket.io