【发布时间】:2016-08-30 03:56:28
【问题描述】:
我有两个资源,员工和员工组。我正在尝试实现一个不错的 URL 结构,例如:
-
GET /employees列出员工。 -
GET /employees/123获取员工 123。 -
GET /employees/groups列出员工组。 -
GET /employees/groups/123获取员工组123。
使用 ExpressJS 我有:
router.get('/employees', (req, res, next) => { next(); });
router.get('/employees/:id', (req, res, next) => { next(); });
router.get('/employees/groups', (req, res, next) => { next(); });
router.get('/employees/groups/:id', (req, res, next) => { next(); });
router.all('*', (req, res) => { res.send('...'); });
这不起作用,因为 Express 无法区分 /employees/:id 和 /employees/groups。它认为groups 是id,因为/employees/:id 排在第一位。
我确实有类似的 URL:
GET /employeesGET /employees/123GET /employees-groupsGET /employees-groups/123
哪个有效,但没有很好的资源/子资源格式。 groups 是 employees 的组,所以我希望 URL 与之匹配。
如果我要为员工获取组,那很好 (/employees/:id/groups),但我会获取所有组,即员工组。
如何设置 Express 路由以正确路由,同时仍保持我想要的 URL 结构..?
我想我需要一种方法让 Express 区分 id 和子资源。有没有办法做到这一点..?
更新
我显然应该说我在每个处理程序中使用next(),因为我需要 Express 转移到另一个中间件函数,一个控制所有请求响应的中间件函数。实际发送响应的是另一个中间件函数。所以我需要:
- 路由处理程序。
- 所有请求的处理程序。
【问题讨论】:
-
让我补充一点,
/nesting/like/this并没有让它变得任何 更好。/employees-groups/很有意义。看看你给出的解释:get employee group 123。这显然是一种不同的资源。给它自己的网址 -
我猜“更好”是主观的。我觉得这样更好,你不知道。我希望 URL 与资源的层次结构相匹配——这些是员工组——所以它们是相关的,如果 URL 显示了这一点,那就太好了 :-)。
-
肯定是 :) 让你的 url 映射代码做到这一点,而不是对非常规情况进行修复可能会更好:)
标签: javascript node.js rest express