蓝图路线

当你运行启用了蓝图的 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 动作。