藍圖路線
當你執行啟用了藍圖的 sails lift
時,框架會檢查你的控制器,模型和配置,以便自動繫結某些路由。這些隱式藍圖路由允許你的應用響應某些請求,而無需在 config/routes.js
檔案中手動繫結這些路由。預設情況下,藍圖路由指向其對應的藍圖操作,其中任何一個都可以使用自定義程式碼覆蓋。
Sails 中有三種型別的藍圖路由:
-
RESTful 路線,路徑始終是
/:model/:id?
。當定義User
模型和控制器時,藍圖以下列方式隱式繫結 RESTful 路由 -'GET /user/:id?': { controller: 'User', action: 'find' }, 'POST /user': { controller: 'User', action: 'create' }, 'PUT /user/:id?': { controller: 'User', action: 'update' }, 'DELETE /user/:id?': { controller: 'User', action: 'destroy' }
這些路由使用 HTTP 謂詞來確定即使路由相同也要採取的操作。因此,對
/user
的POST
請求將建立一個新使用者,/user/123
的PUT
請求將使用主鍵 123 更新使用者,DELETE
的DELETE
請求將刪除主鍵為 123 的使用者。在生產環境中,RESTful 路由應該通常受政策保護,以避免未經授權的訪問。 -
快捷方式路徑,其中要採取的操作在路徑中進行編碼。對於我們的使用者模型和控制器,Sails 隱式繫結了四個快捷方式路徑。
'GET /user/find/:id?': { controller: 'User', action: 'find' }, 'GET /user/create/:id?': { controller: 'User', action: 'create' }, 'GET /user/update/:id?': { controller: 'User', action: 'update' }, 'GET /user/destroy/:id?': { controller: 'User', action: 'destroy' }
例如,
/user/create?name=joe
快捷方式建立一個新使用者,而/user/update/1?name=mike
更新使用者#1 的名稱欄位。請注意,這些路由僅響應GET
請求。快捷方式路徑非常便於開發,但通常應在生產環境中禁用。它不是為生產而設計的。 -
操作路由,自動為自定義控制器操作建立路由。例如,讓
query
成為使用者控制器中定義的自定義操作。然後下面的路線將隱含地用於帆 -'GET /user/query/:id?': { controller: 'User', action: 'query' }, 'POST /user/query/:id?': { controller: 'User', action: 'query' }, 'PUT /user/query/:id?': { controller: 'User', action: 'query' }, 'DELETE /user/query/:id?': { controller: 'User', action: 'query' }
如果在
/user/query/:id?
路由中發出請求,那麼獨立於 HTTP 動詞的動作將是相同的。與 RESTful 和快捷方式路由不同,操作路由不要求控制器具有相應的模型檔案。這意味著,如果你在/api/controllers/FooController.js
檔案中定義了一個控制器但/api/models/Foo.js
檔案中沒有模型,那麼將沒有帶有/foo
的 RESTful 或快捷路由,但仍然會有可供使用的動作路由。
路線順序匹配
當請求到來時,風帆將首先匹配明確定義的路線。如果匹配則不再進行進一步匹配並執行相應的動作。但是如果它不匹配,則路由首先匹配藍圖動作路由,如果不匹配則對抗休息路由,如果它不匹配則快捷路由。因此,如果你的/config/routes.js
檔案有一些如下的條目 -
'/user/query/:id?': {
controller: 'User',
action: 'find'
}
然後你不能指望 query
行動路線工作。因為與 query
動作路線相同的路線將與明確定義的路線匹配,並且將執行使用者控制器的 find
動作。