2016-03-20 4 views
0

この演習の目標は、受信する要求ごとに同じテキストファイルを処理するHTTPサーバーを作成することです。ここに私のコードです。それは動作しません。 HTTPファイルサーバーと.writeHeadメソッド

var http = require ('http'); 
    var fs = require ('fs'); 
    var port = process.argv[2]; 
    var file = process.argv[3]; 
    var bl = require ('bl'); 

var server = http.createServer(function (request, response) { 
    var stream = fs.createReadStream(file); 
    var streamPipe = stream.pipe(response); 
    response.write(streamPipe); 
    }); 

server.listen(port); 

私は正しい答えをチェックし、それは、関数の最初の行に次のコードを配置し、私のResponse.Writeを削除するには()メソッドです:私のコードの代わりに

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

、私は応答ストリーム(ライン10)に要求ストリームから渡されたデータを書き込むだろうと思っている:

response.write(streamPipe) 

私は理解していません。 Response.writeHeadは、ストリームが.createReadStreamメソッドを使用して確立された後ではなく、以前からではありませんか?

response.write()で既存のデータを送信していませんか?私はこれがオブジェクトではなく文字列を返すようにしたいが、パラメータは文字列でなければならず、そうでなければ動作しない。 toString()メソッドは[object Object]を返します。

誰かが、writeHeadメソッドのパラメータを説明してください、それが他のものの前に行くのはなぜですか?

これはロードされた質問です。私はノードに慣れていなくて本当に勉強に興奮していますが、わかりやすいだけです。私はかなり基本的なJavaScriptの経験といくつかのJavaを持っていますので、有望なnode.js開発者のためのすべての助けに感謝します。

答えて

0

各HTTP応答には、ステータス、ヘッダー、およびコンテンツ(空の場合があります)の3つがあります。

ステータスは単にレスポンスのステータスを示します。 200 OK404 Not Found500 Internal Server Errorなど

ヘッダContent-Type: text/plain又はContent-Length: 123456様応答に関する様々なメタデータを含むkey: value対の配列です。それらのうちのいくつかはContent-Lengthのように必須です(実際にはそうでない場合、つまりチャンクされたエンコーディング)がありません。

最後に、コンテンツは単なる一連のバイトです。

また、これはHTTPレスポンスストリームのものとまったく同じです。最初にステータスがあり、次にヘッダがあり、最後にコンテンツがあります。

このメソッドは、ステータスとヘッダーの両方をクライアントに送信するため、常にresponse.writeHeadメソッドを最初に呼び出します。引数として(status_code, headers_object)のペアを受け入れます。status_codeは数字だけです。headers_objectは、ヘッダのシーケンスに変換されるオブジェクト{key1: value1, key2: value2}です。

最後に、response.writeメソッドは、コンテンツのチャンクをクライアントに送信します。文字列を引数として受け取ります。

ここ応答方法について詳しく読む:stream.pipe(response)は、そのあなたのためにボンネットの下にありませんので、あなたがあなたの例では明示的にresponse.writeメソッドを使用していないhttps://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

注意を。読む:

https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options

+0

非常に役に立ちます。私はドキュメンテーションをチェックアウトした。フォローアップq - stream.pipe(レスポンス)で正確に何が起きているのかを素人の言葉で説明できますか?送信元から応答にデータを送信します。 response.writeHead()メソッドを含めて私の問題を修正し、コンテンツの文字列を送信しましたが、この "パイプ"が確立される前に起こります。それは私にとって非常に混乱しています。 – Streamer

+0

@Azurasky 'response'をストリームとして扱うことができます。このストリームに最初に送るのはステータスとヘッダです(つまり、あなたは '。writeHead()'を呼び出します)。しかし、流れはまだ開いています。ですから、今度は 'stream.pipe(response)'を呼び出して、すべてのストリームを読み込み可能なストリーム 'stream'から書き込み可能なストリーム' response'に送ります。そうすれば、あなたは応答の内容を記入します。だから '.writeHead'が' .pipe'の前になければなりません。 (デフォルトでは) '.pipe'は' response'ストリームを自動的に閉じます。今はっきりしていることを願っています。しかし、より多くの質問をしてください。 :) – freakish

関連する問題