7

良い、

node.jsはまったく初めてです。試してみると、ライアン・ダール(http://www.youtube.com/watch?v=jo_B4LTHi3I)の紹介に従っています。この時点(0:17:00頃)にサーバーの説明があります。応答を処理し、

基本的な例は、Webサーバーから「hello」出力を取得し、2秒後に「world」が表示されるようにすることです。このコードはそれを実行することになっています。

//Require the webserver library 
var http = require('http');

var server = http.createServer(function(req, res) {
    res.writeHead(200, { 'content-type' : 'text-plain' });
    res.write('Hello\n');

    //Asynchronous behavior
    setTimeout(function() {
        res.end('World\n');
    }, 2000);
});

server.listen(3000);

それで実行すると、Hello Worldを取得しますが、サーバーからの応答は1つだけで、完全な結果が得られます。つまり、リクエスト>2秒>'HelloWorld'です。リクエストの代わりに>こんにちは>2秒>ワールド。

それはなぜですか?、この動作を変更するにはどうすればよいですか?

私はv0.8.18を使用していますが、curl-ihttp://localhost:3000は正しいヘッダーを返します... HTTP/1.1 200 OK content-type: text-plain Date: Sat, 26 Jan 2013 18:10:05 GMT Connection: keep-alive Transfer-Encoding: chunked

4

3 に答える 3

6

レンダリングを開始する前に、ある程度の量が受信されるまで受信データをバッファリングするのはブラウザです。ノードコードは期待どおりに機能し、応答の最初の部分を送信し、次に2秒間待機してから、後半を送信します。

この動作を観察したい場合は、たくさんのスペースを送信して、ブラウザーのバッファーを空にすることができます。最初の書き込み後にこれを追加すると、ブラウザがリクエストの前半をレンダリングするのがわかります。

var str = '';
for (var i = 0; i < 2000; i++){
  str += ' ';
}
res.write(str);

明らかに、実際のコードではこれを行わないでください。ただし、動作を示すことは良いことです。

于 2013-01-26T19:15:27.180 に答える
1

curlを使用すると、コードは期待どおりに実行されます。ブラウザは全身を待ちますが、curlは「hello」を出力し、2秒待ってから「worls」を出力します。私はあなたの正確なコードをコピーしました、そしてそれは大丈夫です。

于 2013-01-26T19:12:12.520 に答える
0

コンテンツタイプtext/htmlを使用して動作を変更できます

res.writeHead(200, { 'content-type' : 'text/html' });

ブラウザは、コンテンツタイプごとに動作が異なります。また、content-type text-htmlを使用すると、curl holdバッファーが作成され、バッファーが終了した後にのみ印刷されます。

私はこれを実験でテストしましたが、それでもブラウザとカールでそのようにやっている理由がわかりません

于 2020-11-22T23:43:13.297 に答える