JavaScript开关/案件阅读文件之前打破

我正在用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); 

如何在读取文件之前防止开关/shell破裂,并使浏览器显示我的socket.html文件内容?

我会远离在node.js做同步的东西,因为当你阻止,你把每一个请求搁置。 相反,从你的error handling中抽象你的路线。 显然有一些架构的辩论,你想如何做到这一点,但这是我如何做到这一点快:)

 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 ,这将使上述代码正常工作。

fs.readFile是asynchronous的,所以在读取文件时不会阻塞。

改为使用fs.readFileSync。

这取决于你想完成什么, fs.readFile是asynchronous的,所以在这种情况下,如果只是在控制台上打印,把打印放在callback文件中。

如果是为了进一步执行,我build议你使用fs.readFileSync ,如果你是Node.js的新手,同步工作也会更容易。

最简单的方法就是使用return; ,但是你必须记得response.end(); 在callback里面。

另一种解决scheme可能是在启动服务器之前将这些文件读入内存,然后执行诸如response.writeHead(...); response.end(socketFileBuf); response.writeHead(...); response.end(socketFileBuf); 。 显然如果你有大量的文件,文件很大,或者想发送任意文件,你可能不会这样做。 但是对于像你这样的简单的html文件,它应该工作的很好,并且会缩短响应时间。