Node.jsルーティング
リクエストされた URL とその他の必須の GET パラメーターと POST パラメーターをルートに提供する必要があります。その後、ルートはこれらのデータに基づいて対応するコードを実行する必要があります。
そのため、HTTP リクエストを調べて、リクエストされた URL と GET/POST パラメータを抽出する必要があります。この関数がルーティングに属するかサーバーに属するか (またはモジュール自体の関数としても) は確かに議論の価値がありますが、ここでは暫定的に HTTP サーバーの関数として考慮されます。
必要なデータはすべてリクエスト オブジェクトに含まれており、onRequest() コールバック関数の最初のパラメータとして渡されます。ただし、このデータを解析するには、URL モジュールとクエリ文字列モジュールである追加の Node.JS モジュールが必要です。
url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://localhost:8888/start?foo=bar&hello=world --- ----- | | | | querystring(string)["foo"] | | querystring(string)["hello"]
もちろん、querystring モジュールを使用して POST リクエスト本文のパラメータを解析することもできます。これについては後で説明します。
ここで、onRequest() 関数にロジックを追加して、ブラウザによってリクエストされた URL パスを調べましょう:
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という名前のファイルを作成し、次の内容を追加します:
function route(pathname) { console.log("About to route a request for " + pathname); } exports.route = route;
ご覧のとおり、このコードは何も行いませんが、今のところはこれです。ロジックを追加する前に、まずルーティングとサーバーを統合する方法を見てみましょう。
私たちのサーバーはルートの存在を認識し、それらを効果的に使用する必要があります。もちろん、この依存関係をサーバーにハードコーディングすることもできますが、他の言語でのプログラミングの経験から、これは面倒であることがわかっているため、依存関係の注入を使用してルート モジュールを緩やかに追加します。
まず、ルーティング関数をパラメータとして渡せるようにサーバーのstart()関数を拡張しましょう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も適宜拡張していきます。ルーティング関数をサーバーに注入できるようにします:
var server = require("./server"); var router = require("./router"); server.start(router.route);
ここで、渡した関数はまだ何も行いません。
ここでアプリケーション (nodeindex.js、このコマンドラインを常に覚えておいてください) を起動して URL をリクエストすると、アプリケーションが対応する情報を出力するのがわかります。これは、HTTP サーバーがすでにルーティング モジュールを使用していることを示しますそして、要求されたパスをルーターに渡します:
$ node index.js Server has started.
上記の出力では、煩わしい /favicon.ico 要求関連の部分が削除されています。
ブラウザで http://127.0.0.1:8888/ にアクセスすると、出力結果は次のようになります: