Node.jsにおけるHTTPプロトコルトランザクションの解析(上)
3974 ワード
サーバの作成
すべてのnode.jsネットワークアプリケーションはサーバを作成する必要があります.まず、構文糖
createServer
を使用してサーバを作成します.var http = require('http');
var server = http.createServer(function(request, response) {
// !
});
ここで、文の各成分を具体的に分析すると、サーバにアクセスするHTTPリクエスト(HTTP Request)は
http.createServer
のコールバック関数で処理されるので、リクエストプロセッサ(Request Handler)と呼ぶ.実際にhttp.createServer
から返されるserver
オブジェクトは、http.Server
の一例であり、EventEmitter
(http.Server
はnet.Server
から継承され、net.Server
はEventEmitter
である)でもあり、http.createServer
の要求プロセッサは、'request'
イベントを自動的に追加する.上記の分析に基づいて、文法糖を分解します.
http.Server
インスタンスを最初に初期化し、リスナーを追加すると、より具体的なコードが得られます.var server = http.createServer();
server.on('request', function(request, response) {
// !
});
HTTPリクエストがサーバに到着すると、
'request'
イベントがトリガーされ、リクエストプロセッサはrequest
とresponse
の2つのオブジェクトを使用して関連トランザクションを処理します.request
オブジェクトはhttp.IncomingMessage
の一例であり、response
オブジェクトはhttp.ServerResponse
の一例である.具体的な属性は、公式サイトのAPIドキュメントを参照してください.方法,統合リソースロケータとヘッダ(Method,URL and Headers)
HTTPリクエストを処理する際には、まずmethodとURLを理解し、適切な処理手段をとることが望ましい.Node.jsは、これらの属性を
request
オブジェクトに自然に付与する.var method = request.method;
var url = request.url;
var headers = request.headers;
var userAgent = headers['user-agent'];
コード中の
method
は、HTTPプロトコルにおける動詞の方法、例えば、'GET'
、'DELETE'
に対応する.url
は、プロトコル、ホストおよびポートのURL、例えば'/status?name=ryan'
に対応する.headers
解析を容易にするために小文字を使用することに注意してください.リクエストボディ(Request Body)
POST
およびPUT
の要求を受信すると、nodeは要求主体を解析する必要がある.本体データの取得は比較的複雑であり、まずrequest
オブジェクトを用いて1つのコールバック関数を伝達してReadableStream
インタフェースを実現し、次いで、対流'data'
および'end'
イベントの傍受によってデータストリームをキャプチャする.'data'
イベントに応答する各データブロックはBuffer
であり、文字列データを出力する場合は、データブロックを1つの配列に集約し、'end'
イベントに配列を接続して文字列化することが最適である.var body = [];
request.on('data', function(chunk) {
body.push(chunk);
}).on('end', function() {
body = Buffer.concat(body).toString();
// , `body` 。
});
エラー処理
request
ストリームにエラーが発生すると、ストリームの'error'
イベントがトリガーされ、プログラムがイベントをリスニングしていない場合、エラーが投げ出され、プログラムがクラッシュする可能性があります.したがって、request
ストリームに'error'
イベントリスナーを追加することは非常に重要である.request.on('error', function(err) {
//
console.error(err.stack);
});
これまで
サーバの作成を学び、requestからmethod、URL、headers、bodyを取得し、これらの内容を結びつけました.
var http = require('http');
http.createServer(function(request, response) {
var headers = request.headers;
var method = request.method;
var url = request.url;
var body = [];
request.on('error', function(err) {
console.error(err);
}).on('data', function(chunk) {
body.push(chunk);
}).on('end', function() {
body = Buffer.concat(body).toString();
});
}).listen(8080); // http 8080
このプログラムを実行し、ブラウザに
http://localhost:8080
と入力すると、リクエストはタイムアウトし、ブラウザに戻るコンテンツはありません.これまでresponse
オブジェクトに接触していなかったため、http.ServerResponse
の例であり、WritableStream
でもある.以降の内容はresponse
対象について詳しく学習する.参考文献: