リクエストされた URL とその他の必須の GET パラメーターと POST パラメーターをルートに提供する必要があります。その後、ルートはこれらのデータに基づいて対応するコードを実行する必要があります。

したがって、HTTP リクエストを調べて、そこからリクエストされた URL と GET/POST パラメータを抽出する必要があります。 この関数がルーティングに属するべきかサーバーに属するべきか (またはモジュール自体の関数としてさえ) は確かに議論する価値がありますが、ここでは暫定的に HTTP サーバーの関数として定義します。

必要なデータはすべてリクエスト オブジェクトに含まれており、onRequest() コールバック関数の最初のパラメータとして渡されます。 ただし、このデータを解析するには、追加の Node.JS モジュール (それぞれ url モジュールとクエリ文字列モジュール) が必要です。

                   url.parse(string).query
                                           |
           url.parse(string).pathname      |
                       |                   |
                       |                   |
                     ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                                ---       -----
                                 |          |
                                 |          |
              querystring.parse(queryString)["foo"]    |
                                            |
                         querystring.parse(queryString)["hello"]

もちろん、querystring モジュールを使用して POST リクエスト本文のパラメータを解析することもできます。これについては後で説明します。

次に、onRequest() 関数にロジックを追加して、ブラウザによってリクエストされた URL パスを確認しましょう。

server.js ファイルコード:

var http = require("http");
var url = require("url");
 
function start() {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }
 
  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}
 
exports.start = start;

これで、アプリケーションは URL パスによってさまざまなリクエストを区別できるようになりました。これにより、ルーティング (まだ完了していません) を使用して、URL パスに基づいてリクエストをハンドラーにマッピングできるようになりました。

私たちが構築しているアプリケーションでは、/start と /upload からのリクエストを別のコードで処理できることを意味します。 これがどのように組み合わされるかは後で見ていきます。

これでルーターを作成し、router.js という名前のファイルを作成し、次の内容を追加します。

router.jsファイルコード:

function route(pathname) {
  console.log("About to route a request for " + pathname);
}
 
exports.route = route;	

ご覧のとおり、このコードは何も行いませんが、現時点ではこのようになっているはずです。 ロジックを追加する前に、ルーティングとサーバーを統合する方法を見てみましょう。

サーバーはルートの存在を認識し、それらを効果的に使用する必要があります。 もちろん、この依存関係をハードコーディングしてサーバーにバインドすることもできますが、他の言語でのプログラミングの経験から、これは非常に面倒な作業になることがわかっているため、依存関係の注入を使用してルートを緩やかにモジュールに追加します。

まず、サーバーの start() 関数を拡張してルーティング関数をパラメーターとして渡します。server.js ファイルのコードは次のとおりです。

server.js ファイルコード:

var http = require("http");
var url = require("url");
 
function start(route) {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");
 
    route(pathname);
 
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }
 
  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}
 
exports.start = start;

同時に、ルーティング関数をサーバーに挿入できるように、index.js を拡張します。

index.js ファイルコード:

var server = require("./server");
var router = require("./router");
 
server.start(router.route);	

ここで、渡した関数はまだ何も行いません。

ここでアプリケーション (node Index.js、このコマンド ラインを常に覚えておいてください) を起動し、URL をリクエストすると、アプリケーションが対応する情報を出力するのがわかります。これは、HTTP サーバーがすでにルーティング モジュールを呼び出し、要求されたパスをルーターに渡します。

$ node index.js
Server has started.

上記の出力では、煩わしい /favicon.ico リクエストが削除されています。

ブラウザで http://127.0.0.1:8888/ にアクセスすると、出力は次のようになります。