当你使用启用蓝图的 sails lift
命令运行时,框架会检查你的模型和配置,以便自动绑定某些路由。这些隐式蓝图路由(有时称为“影子路由”,甚至简称为“影子”)允许你的应用程序响应某些请求,而无需你手动在 config/routes.js
文件中绑定这些路由。当启用时,蓝图路由指向其对应的蓝图操作(参见下面的“操作路由”),其中任何操作都可以使用自定义代码覆盖。
Sails 中有四种类型的蓝图路由
REST 蓝图是 Sails 自动生成的路由,用于为模型公开传统的 REST API,包括 find
、create
、update
和 destroy
操作。RESTful 路由的路径始终为 /:modelIdentity
或 /:modelIdentity/:id
。这些路由使用 HTTP “动词”来确定要执行的操作。
例如,在启用rest
的情况下,你的应用程序中存在 Boat
模型会生成以下路由
find
蓝图,查找与查询字符串中提供的条件匹配的船只。findOne
蓝图,查找具有给定唯一 ID(即主键)值的单个船只。create
蓝图,使用请求主体中提供的属性创建新的船只。update
蓝图,使用请求主体中提供的属性更新具有给定唯一 ID 的船只。destroy
蓝图,销毁具有给定唯一 ID 的船只。如果 Boat
模型通过名为 drivers
的属性与 Driver
模型具有“多对多”关系,那么将提供以下额外的路由
populate
蓝图,查找与 ID 为 :id
的船只记录相关联的驾驶员记录。add
蓝图,将唯一 ID 等于 :fk
值的驾驶员添加到 ID 为 :id
的船只的 drivers
集合中。remove
蓝图,从 ID 为 :id
的船只的 drivers
集合中删除唯一 ID 等于 :fk
值的驾驶员。replace
蓝图,使用作为请求主体提供的数组中包含的唯一 ID 的驾驶员替换整个 drivers
集合。根据你生成的应用程序的样式,rest
蓝图路由可能默认启用,并且可能适合在生产环境中使用,只要它们受到策略 的保护以避免未经授权的访问。如果你选择“Web 应用程序”模板,rest
蓝图路由默认不会启用。
请注意:大多数 Web 应用程序、微服务,甚至 REST API 最终都需要并非像“创建”、“更新”或“销毁”那样简单的自定义功能。如果/当出现这种情况时,不要害怕编写自己的自定义操作。自定义操作和路由可以(并且在许多情况下应该)仍然组织为 RESTful API,并且可以在必要时与蓝图混合匹配。最重要的是,由于引入了Node.js 中的异步/等待,编写自定义操作不再需要使用回调。
- 如果启用了 CSRF 防护,你需要为 POST/PUT/DELETE 操作提供或禁用CSRF 令牌,否则你会收到 403 Forbidden 响应。
- 如果你的应用程序包含名称与你的模型匹配的控制器,那么你可以通过提供自己的控制器操作来覆盖 RESTful 路由指向的默认操作。例如,如果你有一个
api/controllers/BoatController.js
控制器文件,其中包含自定义的find
操作,那么GET /boat
路由将指向该操作。- 此外,像往常一样,无论你使用的是控制器还是独立操作,相同的逻辑都适用。(就 Sails 而言,一旦应用程序加载到内存中并在
sails lift
中规范化,它的所有操作看起来都一样,无论它们来自哪里。)- 如果你的应用程序在
config/routes.js
中包含与上述 RESTful 路由之一匹配的路由,则将使用该路由而不是默认路由。
快捷路由是一个简单的(仅限开发模式)黑客,它允许你从浏览器的 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
时,快捷路由将把未知属性的任何参数值解释为字符串。如果你没有players
属性且类型为number
,则在执行https://127.0.0.1:1337/game/create?players=2
时要小心!
当操作影子路由(或“操作影子”)启用时,Sails 将自动为你的自定义控制器操作创建路由。这在某些情况下很有用(尤其是在开发过程的早期阶段),通过消除手动绑定路由的需要来加快后端开发速度。启用后,将为控制器的每个操作生成 GET、POST、PUT 和 DELETE 路由。
例如,如果你有一个 FooController.js
文件,其中包含 bar
方法,那么只要启用了 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 中配置蓝图,包括如何启用/禁用不同类别的蓝图路由。