在阅读文件之前javascript开关/大小写中断

时间:2014-07-30 00:48:07

标签: javascript html node.js socket.io

我正在编写一个带有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文件内容之前防止切换/断开?

4 个答案:

答案 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的新手,那么同步工作也会轻松很多。