【问题标题】:handling identical express routes处理相同的快速路线
【发布时间】:2020-02-20 20:36:14
【问题描述】:

我正在使用 NodeJS/Express/Mongoose 构建一个应用程序,我正在尝试设置一个暂停用户路由,但我正在努力解决如何定义路由以避免任何重复。

我目前有这些用于创建新用户配置文件并随后编辑该配置文件的路线,它们都引用了用户模型。

router.get("/users/:id", isLoggedIn, asyncErrorHandler(getUserProfile));

router.put("/users/:id", isLoggedIn,(updateUserProfile));

个人资料所有者是唯一可以编辑/更新其个人资料的用户,他们必须输入密码才能这样做。一切正常。

但是,我现在正在创建一个单独的“暂停用户”路由,该路由将由单独的管理员/版主更新。新路线可以正常显示表单:

router.get("/users/:id/suspend", isLoggedIn, asyncErrorHandler(getSuspendUser));

但是说到put路由,也是引用同一个用户模型来更新,那么如何避免重复上面的put路由(根据我的理解是不允许的)?

router.put("/users/:id", isLoggedIn, asyncErrorHandler(putSuspendUser));

提前致谢。

【问题讨论】:

  • 你在做什么应该没问题。如果您想要不同的行为,您可以为不同的VERBS 使用相同名称的路由。正如您可以使用 router.all() 来表示所有不同的 VERBS,如果您想要相同的行为。
  • 嗨@silencedogood,谢谢,虽然我不觉得是这样;当我提交挂起路由的表单时,它会转移到 updateUserProfile 路由,因为它还使用路径 router.put("/users/:id"。我在这里遗漏了什么?谢谢
  • 好吧,除非我遗漏了什么,否则您定义路线的方式似乎违反直觉。为什么不用("/users/suspend/:id") 而不是("/users/:id/suspend")??
  • 我认为这可能是我对正确使用约定的理解不足;我真的是基于我目前设置的路线。我在下面采用了 Victor 的方法,但也感谢您的意见

标签: node.js express mongoose


【解决方案1】:

我强烈建议将管理员路由与常规路由分开。这应该可以解决所有问题:

router.get("/users/:id", isLoggedIn, asyncErrorHandler(getUserProfile));
router.put("/users/:id", isLoggedIn,(updateUserProfile));

router.get("/admin/users/:id/suspend", isLoggedIn, asyncErrorHandler(getSuspendUser));
router.put("/admin/users/:id", isLoggedIn, asyncErrorHandler(putSuspendUser));

然后你可以添加额外的中间件来检查用户是否真的是管理员路由上的管理员:)

/admin/users/:id 上执行GET 是无操作的,如果您愿意,可以重用代码以按照GET /users/:id 返回用户,但实际上,您永远不会使用它。

【讨论】:

  • 谢谢维克多!是的,我同意这是有道理的并且现在正在工作,似乎我还有一个次要问题,这就是为什么我最初很挣扎,但管理路线是一个很好的选择(我已经有了中间件)。
猜你喜欢
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2020-01-30
  • 1970-01-01
相关资源
最近更新 更多