Sails自定义路由

时间:2014-08-26 07:34:40

标签: sails.js

以下是我的应用程序的自定义路由。有没有更好的方法或组织它们?我不想在添加新模块时创建一组自定义路由。理想情况下,我希望在不定义其中任何一个的情况下采取行动。由于我的网址深度较低,我不会利用默认的Controller / Action /:id routing。

添加大量自定义路线是否会影响应用性能?帮助赞赏。

'get /location/:locationId/equipment/new'         : 'LocationController.equipmentNew',
'get /location/:locationId/equipment/create'      : 'LocationController.equipmentCreate',
'get /location/:locationId/equipment/edit/:id'    : 'LocationController.equipmentEdit',
'get /location/:locationId/equipment/update/:id'  : 'LocationController.equipmentUpdate',
'get /location/:locationId/equipment/list'        : 'LocationController.equipmentList',
'get /location/:locationId/equipment/show/:id'    : 'LocationController.equipmentShow',
'get /location/:locationId/equipment/delete/:id'  : 'LocationController.equipmentDelete',

'get /location/:locationId/employee/new'          : 'LocationController.employeeNew',
'get /location/:locationId/employee/create'       : 'LocationController.employeeCreate',
'get /location/:locationId/employee/edit/:id'     : 'LocationController.employeeEdit',
'get /location/:locationId/employee/update/:id'   : 'LocationController.employeeUpdate',
'get /location/:locationId/employee/list'         : 'LocationController.employeeList',
'get /location/:locationId/employee/show/:id'     : 'LocationController.employeeShow',
'get /location/:locationId/employee/delete/:id'   : 'LocationController.employeeDelete',

'get /location/:locationId/manager/new'           : 'LocationController.managerNew',
'get /location/:locationId/manager/create'        : 'LocationController.managerCreate',
'get /location/:locationId/manager/edit/:id'      : 'LocationController.managerEdit',
'get /location/:locationId/manager/update/:id'    : 'LocationController.managerUpdate',
'get /location/:locationId/manager/list'          : 'LocationController.managerList',
'get /location/:locationId/manager/show/:id'      : 'LocationController.managerShow',
'get /location/:locationId/manager/delete/:id'    : 'LocationController.managerDelete',
'get /location/:locationId/participate'           : 'LocationController.participate',

2 个答案:

答案 0 :(得分:6)

是的,这是可能的,但您必须使用快速中间件编写自己的请求路由器。

在SailsJS中,每个policy都是一个中间件。您可以将自定义参数与URL中的控制器和操作名称一起传递,并直接从策略中调用相关的控制器操作。

首先,您需要为有和没有的动作定义路线:id参数

配置/ routes.js

/locations/:locationId/:controller/:action : { policy: 'router' }
/locations/:locationId/:controller/:action/:id : { policy: 'router' }

接下来,您需要编写代码,以根据URL参数将请求重定向到控制器和操作。

API /策略/ router.js

module.exports = function (req, res, next) {
    var controller = req.param('controller');
    var action = req.param('action');
    sails.controllers[controller][action](req, res);
};

然后,您可以在单独的文件中定义控制器:

api / controllers / EmployeeController.js& API /控制器/ EquipmentController.js

module.exports = {
    new: function(req, res) {
        var params = req.params.all();
        // ...
    },
    // ... other actions
};

重要提示:请记住保护您不想公开的操作!

希望有所帮助。

答案 1 :(得分:3)

您的API似乎可以使用一些重构。您有四个模型(EquipmentEmployeeManagerLocation),但您可以在API中的location下对它们进行命名。相反,它们都可以是一级端点,允许您使用Sails' blueprints为您处理路由。例如,如果您删除了所有这些自定义路由,并在 api / controllers 文件夹中创建了四个控制器:

  • EquipmentController.js
  • EmployeeController.js
  • ManagerController.js
  • LocationController.js

api / models 文件夹中的四个模型:

  • Equipment.js
  • Employee.js
  • Manager.js
  • Location.js

然后根本不做任何工作,当你举起Sails时,你将能够做类似的事情

  • GET /manager?location=5列出位置5的所有经理
  • POST /equipment创建新设备
  • PUT /employee/123更新员工123

将所有内容提升到第一级,然后使用?location=5之类的查询来过滤输出,这些都会让事情变得更加清晰。

如果您担心这会让人们跨位置查看所有员工,或者某些用户只能查看某些位置,则可以使用{{3}来控制},精确用于访问控制。只需添加一项政策,确保在每个"获取经理"的参数中设置一个位置。电话,或者检查当前登录用户是否有权查看他们尝试访问的位置的电话。