任何網路應用程式最基本的功能是能夠解析發送到 URL 的請求,然後發回回應。為了做到這一點,您的應用程式必須能夠區分不同的 URL。
如同大多數的網路框架,Sails 提供了路由器:一種將 URL 對應到動作和視圖的機制。路由是規則,告訴 Sails 在面對傳入的請求時該怎麼做。在 Sails 中,路由主要有兩種:自訂(或「顯式」)和自動(或「隱式」)。
Sails 讓您可以隨心所欲地設計應用程式的 URL — 沒有框架的限制。
每個 Sails 專案都帶有 config/routes.js
,一個簡單的 Node.js 模組,它匯出一個包含自訂或「顯式」路由的物件。例如,這個 routes.js
檔案定義了六個路由;其中一些指向動作,而另一些則直接路由到視圖。
// 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 發送的消息。它通過監聽發送到保留事件處理程序中的 Socket.io 消息來完成此操作,格式簡單,稱為 JWR (JSON-WebSocket Request/Response)。此規範已在 客戶端套接字 SDK 中實作並開箱即用。
進階使用者可以選擇完全繞過路由器,並將底層、完全可自訂的 WebSocket 消息直接發送到底層的 Socket.io 伺服器。您可以直接在應用程式的 onConnect
函數(位於 config/sockets.js
中)中綁定套接字事件,但請記住,在大多數情況下,您最好利用請求解釋器進行套接字通信。在 HTTP 和 WebSockets 之間保持一致的路由有助於使您的應用程式保持可維護性。