當您啟用藍圖並執行 sails lift
時,框架會檢查您的模型和組態,以便自動綁定某些路由。 這些隱含的藍圖路由(有時稱為「影子路由」,甚至簡稱為「影子」)允許您的應用程式在無需於 config/routes.js
檔案中手動綁定這些路由的情況下,回應某些請求。 啟用後,藍圖路由會指向其對應的藍圖動作(請參閱下方的「動作路由」),任何動作都可以使用自訂程式碼覆寫。
Sails 中有四種類型的藍圖路由
REST 藍圖是 Sails 自動產生的路由,用於為模型公開傳統的 REST API,包括 find
、create
、update
和 destroy
動作。RESTful 路由的路徑始終為 /:modelIdentity
或 /:modelIdentity/:id
。 這些路由使用 HTTP「動詞」來決定要採取的動作。
例如,在啟用 rest
的情況下,在您的應用程式中擁有 Boat
模型會產生以下路由
find
藍圖。findOne
藍圖。create
藍圖。update
藍圖。destroy
藍圖。如果 Boat
模型透過名為 drivers
的屬性與 Driver
模型具有「多對多」關聯,則以下額外路由將可用
populate
藍圖,尋找與 ID 為 :id
的 boat 記錄相關聯的 driver 記錄。:fk
值的 driver 新增至 ID 為 :id
的 boat 的 drivers
集合,使用 add
藍圖。:id
的 boat 的 drivers
集合中移除唯一 ID 等於 :fk
值的 driver,使用 remove
藍圖replace
藍圖,將整個 drivers
集合替換為唯一 ID 包含在作為請求 body 提供的陣列中的 drivers。根據您產生的應用程式樣式,rest
藍圖路由預設可能會啟用,並且可能適用於生產環境情境,只要它們受到政策保護以避免未經授權的存取。 如果您選擇「Web app」範本,則預設情況下不會啟用 rest
藍圖路由。
敬告:大多數 Web 應用程式、微服務,甚至 REST API 最終都需要自訂功能,這些功能實際上不像「建立」、「更新」或「銷毀」那麼簡單。 如果/當時間到來時,不要害怕編寫您自己的自訂動作。 自訂動作和路由可以,並且在許多情況下應該,仍然組織為 RESTful API,並且在必要時可以與藍圖混合搭配使用。 最棒的是,由於 Node.js 中的 async/await 的引入,編寫自訂動作不再需要使用 callback。
- 如果啟用 CSRF 保護,您需要為 POST/PUT/DELETE 動作提供或停用 CSRF token,否則您將收到 403 Forbidden 回應。
- 如果您的應用程式包含一個控制器,其名稱與您的模型名稱相符,則您可以透過提供您自己的控制器動作來覆寫 RESTful 路由指向的預設動作。 例如,如果您有一個
api/controllers/BoatController.js
控制器檔案,其中包含自訂的find
動作,則GET /boat
路由將指向該動作。- 此外,與往常一樣,無論您使用的是控制器還是獨立動作,相同的邏輯都適用。(就 Sails 而言,一旦應用程式載入到記憶體中並在
sails lift
中標準化,其所有動作看起來都相同,無論它們來自何處。)- 如果您的應用程式在
config/routes.js
中包含與上述 RESTful 路由之一相符的路由,則將使用它而不是預設路由。
快捷路由是一種簡單的(僅限開發模式)hack,可從瀏覽器的 URL 列存取您的模型。
快捷路由如下
路由 | 藍圖動作 | 範例 URL |
---|---|---|
GET /:modelIdentity/find | find | https://127.0.0.1:1337/user/find?name=bob |
GET /:modelIdentity/find/:id | findOne | https://127.0.0.1:1337/user/find/123 |
GET /:modelIdentity/create | create | https://127.0.0.1:1337/user/create?name=bob&age=18 |
GET /:modelIdentity/update/:id | update | https://127.0.0.1:1337/user/update/123?name=joe |
GET /:modelIdentity/destroy/:id | destroy | https://127.0.0.1:1337/user/destroy/123 |
GET /:modelIdentity/:id/:association/add/:fk | add | https://127.0.0.1:1337/user/123/pets/add/3 |
GET /:modelIdentity/:id/:association/remove/:fk | remove | https://127.0.0.1:1337/user/123/pets/remove/3 |
GET /:modelIdentity/:id/:association/replace?association=[1,2...] | replace | https://127.0.0.1:1337/user/123/pets/replace?pets=[3,4] |
當 Sails 在生產環境中啟動時,應始終停用快捷路由。 但是它們在開發期間可能非常方便,特別是如果您不喜歡使用終端機。
- 與 RESTful 路由一樣,快捷路由可以透過在相符的控制器中提供動作,或在
config/routes.js
中提供路由來覆寫。- 對於類似的 RESTful/快捷路由,會執行相同的動作。 例如,當 Sails 載入
api/models/User.js
時建立的POST /user
和GET /user/create
路由,將透過執行相同的程式碼來回應(即使您覆寫藍圖動作)- 當使用 NoSQL 資料庫(例如 MongoDB)且模型的
schema
組態設定為false
時,快捷路由會將未知屬性的任何參數值解釋為字串。 如果您沒有具有number
類型的players
屬性,請小心執行https://127.0.0.1:1337/game/create?players=2
!
當啟用動作影子路由(或「動作影子」)時,Sails 將自動為您的自訂控制器動作建立路由。 這有時很有用(尤其是在開發過程的早期),透過消除手動綁定路由的需求來加速後端開發。 啟用後,將為每個控制器的動作產生 GET、POST、PUT 和 DELETE 路由。
例如,如果您有一個具有 bar
方法的 FooController.js
檔案,那麼只要啟用 sails.config.blueprints.actions
,就會自動為您建立 /foo/bar
路由。 與 RESTful 和快捷影子不同,隱含的每個動作的影子路由不要求控制器具有對應的模型檔案。
如果存在 index
動作,則會為其建立額外的裸路由。 最後,所有 actions
藍圖都支援可選的路徑參數 id
,以方便使用。
自 Sails v1.0 以來,動作影子預設為停用。 它們對於生產環境來說還可以——但是,如果您想在生產部署中繼續使用控制器/動作自動路由,則必須非常小心,不要無意中將不安全/非預期的控制器邏輯暴露給 GET 請求。 您可以使用回應目標語法,輕鬆地在您的 /config/routes.js
檔案中關閉特定的方法或路徑,例如
'POST /user': {response: 'notFound'}
- 動作路由回應所有 HTTP 動詞(GET、PUT、POST 等)。 您可以在動作內使用
req.method
來判斷使用了哪種方法。
當啟用動作影子 (sails.config.blueprints.actions
) 時,會自動為任何碰巧命名為 index
的動作公開額外的根影子路由。 例如,如果您有一個 FooController.js
檔案,其中包含 index
動作,則會自動為該動作綁定 /foo
影子路由。 同樣地,如果您在 api/controllers/foo/index.js
中有一個獨立動作,則會代表它自動公開 /foo
路由。
閱讀更多關於 在 Sails 中配置藍圖,包括如何啟用/停用不同類別的藍圖路由。