0

私は完全なノード初心者で、問題に直面しています:

var http    = require("http");
var url     = require('url');
var fs      = require('fs');
var io      = require('socket.io');

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(__dirname + path, function(error, data){
            if (error){
                response.writeHead(404);
                response.write("This doesn't exist - 404");
                console.log(error);
            } else {
                console.log('hi!'); // **************<---- I'm getting here
                response.writeHead(404, {'Content-Type': 'text/html'});
                response.write(data, 'utf8');
            }
        });
        break;
    default:
        response.writeHead(404);
        response.write("This page does not exist - 404");
        console.log(path);
        break;
}
response.end(); 
}); 

server.listen(8001);

io.listen(server);

「else」内で console.log() に到達していますが、response.write は何も出力しません。console.log(data) を取得すると、

4

2 に答える 2

1

私のコメントから拡張:

fs.readFile()は非同期呼び出しです。つまり、ノードにファイルを開こうとするように指示し、それを待たずに先に進みます。したがって、このコードでは:

fs.readFile(__dirname + path, function(error, data){
    if (error){
        response.writeHead(404);
        response.write("This doesn't exist - 404");
        console.log(error);
    } else {
        console.log('hi!'); // **************<---- I'm getting here
        response.writeHead(404, {'Content-Type': 'text/html'});
        response.write(data, 'utf8');
    }
});
response.end();

このコードの機能は次のとおりです。

  1. あなた: 「ノードさん、このファイルを開いてください。終わったら教えてください」;
  2. あなた: 「応答を終了します。もう必要ありません。」;
  3. (後で不明な時間)
    ノード:「こんにちは、ファイルの準備ができました。」.
    あなた: 「いいですね、ファイルを応答ストリームに書き込みます。」
    Node: "...なんと、ストリームを閉じました!"

(OK、最後の行を追加しました)

したがって、意図したことを行うには、次の 2 つのオプションがあります。

  1. を使用して同期的にファイルを開く操作を行いますfs.readFileSync()。これにより、使い慣れた「線形」プログラミングを実行できます。

    try {
        var data=fs.readFileSync(__dirname+path,{"encoding":"utf8"});
        response.writeHead(200,{"Content-Type":"text/html"});
        response.write(data,"utf8");
    }catch(e){
        response.writeHead(400,{"Content-Type":"text/plain"});
        response.write("This doesn't exist -  404");
    }
    response.end();
    
  2. fs.readFile()サーバー リスナーではなく、のコールバック関数で応答を終了します。

    switch(path){
        case '/':
            response.writeHead(200, {'Content-Type': 'text/html'}); 
            response.write('Hello World');
            response.end();/* here */
            break;
        case '/socket.html':
            fs.readFile(__dirname + path, function(error, data){
                if (error){
                    response.writeHead(404);
                    response.write("This doesn't exist - 404");
                    response.end(); /* here */
                    console.log(error);
                } else {
                    console.log('hi!');
                    response.writeHead(200, {'Content-Type': 'text/html'});
                    response.write(data, 'utf8');
                    response.end(); /* here */
                }
            });
            break;
        default:
            response.writeHead(404);
            response.write("This page does not exist - 404");
            response.end(); /* here */
            console.log(path);
            break;
    }
    //response.end(); <-- get rid of this line
    

また、ファイルのオープンが成功したときに呼び出しでに変更404する200writeHead()ことに注意してください。それが実際の意味だと思います。

于 2013-10-09T03:24:37.880 に答える