ルーティング
ルーティングとは、アプリケーションのエンドポイント (URI) を定義する方法と、クライアントのリクエストに応答する方法を指します。
ルーティングは、URI、HTTP リクエスト (GET、POST など)、およびいくつかのハンドルで構成されます。その構造は次のとおりです: app.METHOD(path, [callback...], callback)、app はエクスプレスです。 object 例では、METHOD は HTTP リクエスト メソッド、path はサーバー上のパス、callback はルートが一致したときに実行される関数です。
基本的なルーティングの例を次に示します:
var express = require('express'); var app = express(); // respond with "hello world" when a GET request is made to the homepage app.get('/', function(req, res) { res.send('hello world'); });
ルーティング方法
ルーティング メソッドは HTTP リクエスト メソッドから発生し、Express インスタンスに関連付けられます。
次の例は、アプリケーションとパスに対して定義された GET リクエストと POST リクエストを示しています。
// GET method route app.get('/', function (req, res) { res.send('GET request to the homepage'); }); // POST method route app.post('/', function (req, res) { res.send('POST request to the homepage'); });
Express は、HTTP リクエストに対応する次のルーティング メソッドを定義します: get、post、put、head、delete、options、trace、copy、lock、mkcol、move、purge、propfind、proppatch、unlock、report、mkactivity、checkout、マージ、M-検索、通知、サブスクライブ、サブスクライブ解除、パッチ、検索、および接続。
一部のルーティング メソッド名は有効な JavaScript 変数名ではありません。この場合は、次のように括弧表記を使用します。app['m-search']('/', function ...
app.all() は、どの HTTP メソッドにも対応しない特別なルーティング メソッドであり、その機能はパス上のすべてのリクエストに対してミドルウェアをロードすることです。
以下の例では、GET、POST、PUT、DELETE、または http モジュールでサポートされているその他の HTTP リクエストを使用するかどうかに関係なく、「/secret」からのリクエストに対してハンドルが実行されます。
app.all('/secret', function (req, res, next) { console.log('Accessing the secret section ...'); next(); // pass control to the next handler });
ルーティングパス
ルーティング パスとリクエスト メソッドは、文字列、文字列パターン、または正規表現のいずれかであるリクエストのエンドポイントを一緒に定義します。
Express はルーティング パスを一致させるために path-to-regexp を使用します。ルーティング パスを定義するすべての方法についてはドキュメントを参照してください。 Express Route Tester は、基本的な Express ルートをテストするための優れたツールですが、パターン マッチングはサポートしていません。
クエリ文字列はルーティング パスの一部ではありません。
文字列を使用したルーティング パスの例:
// 匹配根路径的请求 app.get('/', function (req, res) { res.send('root'); }); // 匹配 /about 路径的请求 app.get('/about', function (req, res) { res.send('about'); }); // 匹配 /random.text 路径的请求 app.get('/random.text', function (req, res) { res.send('random.text'); }); 使用字符串模式的路由路径示例: // 匹配 acd 和 abcd app.get('/ab?cd', function(req, res) { res.send('ab?cd'); }); // 匹配 abcd、abbcd、abbbcd等 app.get('/ab+cd', function(req, res) { res.send('ab+cd'); }); // 匹配 abcd、abxcd、abRABDOMcd、ab123cd等 app.get('/ab*cd', function(req, res) { res.send('ab*cd'); }); // 匹配 /abe 和 /abcde app.get('/ab(cd)?e', function(req, res) { res.send('ab(cd)?e'); });
文字 ?、+、*、および () は正規表現のサブセットであり、- と . は文字列ベースのパスで文字通り解釈されます。
正規表現を使用したルーティング パスの例:
// 匹配任何路径中含有 a 的路径: app.get(/a/, function(req, res) { res.send('/a/'); }); // 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等 app.get(/.*fly$/, function(req, res) { res.send('/.*fly$/'); });
ルートハンドル
リクエスト処理用にミドルウェアのように動作する複数のコールバック関数を提供できます。唯一の違いは、これらのコールバック関数が next('route') メソッドを呼び出し、他のルート コールバック関数をスキップできることです。このメカニズムはルーティングの前提条件を定義するために使用でき、既存のパスで実行を継続することが意味がない場合は、残りのパスに制御を与えることができます。
ルート ハンドルにはさまざまな形式があり、以下に示すように、関数、関数の配列、またはその 2 つの混合にすることができます。
コールバック関数を使用してルーティングを処理します:
app.get('/example/a', function (req, res) { res.send('Hello from A!'); });
複数のコールバック関数を使用してルーティングを処理します (次のオブジェクトを指定することを忘れないでください):
app.get('/example/b', function (req, res, next) { console.log('response will be sent by the next function ...'); next(); }, function (req, res) { res.send('Hello from B!'); });
コールバック関数配列を使用してルーティングを処理します:
var cb0 = function (req, res, next) { console.log('CB0'); next(); } var cb1 = function (req, res, next) { console.log('CB1'); next(); } var cb2 = function (req, res) { res.send('Hello from C!'); } app.get('/example/c', [cb0, cb1, cb2]);
関数と関数配列を組み合わせてルーティングを処理します:
var cb0 = function (req, res, next) { console.log('CB0'); next(); } var cb1 = function (req, res, next) { console.log('CB1'); next(); } app.get('/example/d', [cb0, cb1], function (req, res, next) { console.log('response will be sent by the next function ...'); next(); }, function (req, res) { res.send('Hello from D!'); });
応答方法
次の表の応答オブジェクト (res) のメソッドは、クライアントに応答を返し、要求と応答のサイクルを終了します。ルート ハンドルでメソッドが呼び出されない場合、クライアントからのリクエストはハングします。