Webアプリケーションの最も基本的な機能の1つは、URLに送信されたリクエストを解釈し、レスポンスを送信する機能です。これを行うには、アプリケーションが1つのURLを別のURLと区別できる必要があります。
ほとんどのWebフレームワークと同様に、Sailsはルーターを提供します。これは、URLをアクションとビューにマッピングするためのメカニズムです。ルートは、着信リクエストに直面したときにSailsに何をすべきかを指示するルールです。Sailsには、カスタム(または「明示的」)と自動(または「暗黙的」)の2つの主要なルートの種類があります。
Sailsを使用すると、アプリのURLを自由に設計できます。フレームワークによる制限はありません。
すべてのSailsプロジェクトには、config/routes.js
が付属しています。これは、カスタムの、または「明示的な」ルートのオブジェクトをエクスポートするシンプルなNode.jsモジュールです。たとえば、このroutes.js
ファイルは6つのルートを定義しており、その一部はアクションを指し、他はビューに直接ルーティングされます。
// config/routes.js
module.exports.routes = {
'GET /signup': { view: 'conversion/signup' },
'POST /signup': { action: 'entrance/signup' },
'GET /login': { view: 'portal/login' },
'POST /login': { action: 'entrance/login' },
'/logout': { action: 'account/logout' },
'GET /me': { action: 'account/profile' }
各ルートは、左側にはアドレス(例:'GET /me'
)、右側にはターゲット(例:{ action: 'account/profile' }
)で構成されます。アドレスはURLパスであり、(オプションで)特定のHTTPメソッドです。ターゲットはさまざまな方法で定義できます(このトピックに関する詳細な概念セクションを参照)が、上記の構文が最も一般的です。Sailsは着信リクエストを受け取ると、一致するルートがあるかどうかをすべてのカスタムルートのアドレスに対して確認します。一致するルートが見つかった場合、リクエストはそのターゲットに渡されます。
たとえば、'GET /me': { action: 'account/profile' }
は次のように解釈できます。
「Sailsよ、
http://mydomain.com/me
へのGETリクエストを受け取ったときは、account/profile
アクションを実行してくれ。」
ルート自体にビューレイアウトを指定することもできます。
'GET /privacy': {
view: 'legal/privacy',
locals: {
layout: 'users'
}
},
function (req, res, next) {}
)を含む、有効なルートターゲットにルートをプログラムでバインドすることもできます。ただし、可能な限り従来のルートターゲット構文を使用する必要があります。これは、開発を効率化し、トレーニングを簡素化し、アプリの保守性を向上させます。カスタムルートに加えて、Sailsは多くのルートを自動的にバインドします。URLがカスタムルートと一致しない場合、自動ルートのいずれかと一致し、レスポンスが生成される可能性があります。Sailsの自動ルートの主なタイプは次のとおりです。
カスタムルートまたは自動ルートのいずれにもリクエストURLが一致しない場合、Sailsはデフォルトの404レスポンスを送信します。このレスポンスは、アプリにapi/responses/notFound.js
ファイルを追加することでカスタマイズできます。カスタムレスポンスの詳細を参照してください。
リクエストの処理中に未処理のエラーが発生した場合(たとえば、いくつかのアクションコード内)、Sailsはデフォルトの500レスポンスを送信します。このレスポンスは、アプリにapi/responses/serverError.js
ファイルを追加することでカスタマイズできます。カスタムレスポンスの詳細を参照してください。
Sailsルーターは「プロトコル非依存型」です。つまり、HTTPリクエストとWebSocketsを介して送信されたメッセージの両方を処理する方法を理解しています。これは、JWR(JSON-WebSocket Request/Response)と呼ばれるシンプルな形式で予約済みイベントハンドラーに送信されたSocket.ioメッセージをリッスンすることによって実現されます。この仕様は実装されており、クライアント側のソケットSDKですぐに使用できます。
上級ユーザーは、ルーターを完全に回避し、基になるSocket.ioサーバーに直接低レベルで完全にカスタマイズ可能なWebSocketメッセージを送信することを選択できます。onConnect
関数(config/sockets.js
に配置)でソケットイベントを直接バインドできますが、ほとんどの場合、ソケット通信にはリクエストインタープリターを活用する方が良いことに注意してください。HTTPとWebSocketsで一貫性のあるルートを維持すると、アプリの保守性が向上します。