藍圖路線

當你執行啟用了藍圖的 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 謂詞來確定即使路由相同也要採取的操作。因此,對/userPOST 請求將建立一個新使用者,/user/123PUT 請求將使用主鍵 123 更新使用者,DELETEDELETE 請求將刪除主鍵為 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 動作。