Node.jsにおけるHTTPプロトコルトランザクションの解析(上)

3974 ワード

  • サーバ
  • の作成
  • メソッド、統合リソースロケータとヘッダ(Method,URL and Headers)
  • リクエストボディ
  • エラー処理
  • 現在のところ
  • 参考文献:
  • Node.jsに接触したばかりの初心者でも簡単にネットワークアプリケーションを作成できますが、要求を処理するコールバック関数やそのパラメータは、初心者に疑問を与えることがよくあります.以下、公式サイトの資料を参照して、HTTPプロトコルのトランザクション処理過程におけるnode.jsのいくつかの重要な定義と原理過程を分析する.
    サーバの作成
    すべての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.Servernet.Serverから継承され、net.ServerEventEmitterである)でもあり、http.createServerの要求プロセッサは、'request'イベントを自動的に追加する.
    上記の分析に基づいて、文法糖を分解します.http.Serverインスタンスを最初に初期化し、リスナーを追加すると、より具体的なコードが得られます.
    var server = http.createServer();
    server.on('request', function(request, response) {
      //           !
    });
    

    HTTPリクエストがサーバに到着すると、'request'イベントがトリガーされ、リクエストプロセッサはrequestresponseの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対象について詳しく学習する.
    参考文献:
  • [1]: Anatomy of an HTTP Transaction