我正在编写一个带有socket.io实现的简单node.js服务器。当我去 mylocalip:8005 / socket.html ' socket_break'在&socket;数据'之前打印在控制台中。所以我在浏览器中看到了空白页而不是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文件内容之前防止切换/断开?
答案 0 :(得分:1)
我会远离在node.js中执行同步操作,因为当您阻止时,您会将每个发出请求的人置于保持状态。相反,从错误处理中抽象出您的路线。显然有一些建筑辩论就像你想要这样做,但这就是我如何快速做到这一点:)
var http = require("http");
var url = require('url');
var fs = require('fs');
// Perhaps include this via a require('httpExceptionHandler')
function httpExceptionHandler(req, res) {
return {
404: function() {
res.statusCode = 404;
res.end("opps this doesn't exist - 404");
},
500: function(error) {
res.statusCode = 500;
res.end("internal server error");
}
}
}
// Perhaps include this via a require('routes')
var routes = {
'/': function(server) {
var res = server.response;
res.setHeader('Content-Type', 'text/plain');
res.end('hello world');
},
'/socket.html': function(server) {
var fileStream = fs.createReadStream('socket.html');
fileStream.on('error', server.httpExceptionHandler['500']);
fileStream.pipe(server.response);
}
};
var server = http.createServer(function(request, response){
var path = url.parse(request.url).pathname;
var routeFn = routes[path];
var server = {
httpExceptionHandler: httpExceptionHandler(request, response),
request: request,
response: response
};
if (routeFn) {
// Set some default headers
response.statusCode = 200;
response.setHeader('Content-Type', 'text/html');
// A better design might be to return an action like
// Redirect, Exception, etc... not sure
routeFn(server);
} else {
server.httpExceptionHandler['404']();
}
});
server.listen(8005);
在完成操作之前,我们不会结束response
,这使上述代码能够正常运行。
答案 1 :(得分:0)
最简单的方法是使用return;
,但您必须记住回调中的response.end();
。
另一种解决方案可能是在启动服务器之前将文件读入内存,然后执行response.writeHead(...); response.end(socketFileBuf);
之类的操作。显然,如果您有大量文件,拥有非常大的文件或想要发送任意文件,您可能不想这样做。但是对于你可能在这里的简单html文件,它应该可以很好地工作并且会减少响应时间。
答案 2 :(得分:0)
fs.readFile是异步的,因此在读取文件时它不会阻塞。
改为使用fs.readFileSync。
答案 3 :(得分:0)
这取决于你想要完成什么,fs.readFile
是异步的,所以在这种情况下,如果它只是在控制台上打印,那么将打印放在回调文件中。
如果要进一步执行,我建议您使用fs.readFileSync
,如果您是Node.js的新手,那么同步工作也会轻松很多。