以下是我的应用程序的自定义路由。有没有更好的方法或组织它们?我不想在添加新模块时创建一组自定义路由。理想情况下,我希望在不定义其中任何一个的情况下采取行动。由于我的网址深度较低,我不会利用默认的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',
答案 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似乎可以使用一些重构。您有四个模型(Equipment
,Employee
,Manager
和Location
),但您可以在API中的location
下对它们进行命名。相反,它们都可以是一级端点,允许您使用Sails' blueprints为您处理路由。例如,如果您删除了所有这些自定义路由,并在 api / controllers 文件夹中创建了四个控制器:
和 api / models 文件夹中的四个模型:
然后根本不做任何工作,当你举起Sails时,你将能够做类似的事情
GET /manager?location=5
列出位置5的所有经理POST /equipment
创建新设备PUT /employee/123
更新员工123 将所有内容提升到第一级,然后使用?location=5
之类的查询来过滤输出,这些都会让事情变得更加清晰。
如果您担心这会让人们跨位置查看所有员工,或者某些用户只能查看某些位置,则可以使用{{3}来控制},精确用于访问控制。只需添加一项政策,确保在每个"获取经理"的参数中设置一个位置。电话,或者检查当前登录用户是否有权查看他们尝试访问的位置的电话。