首页 > 解决方案 > 在 url 路径开头的参数的快速路由器排序

问题描述

我正在使用 express,我希望我的用户个人资料 URL 如下所示:example.com/:username

但是,我仍然需要其他 URL,例如 example.com/login 和 example.com/view/:id

如果我这样订购路由器,当请求发送到 example.com/login 时,它会将“login”视为用户名:

router.get('/:username', function (req, res, next) {
  res.render('profile', {data: req.params.username});
})

router.get('/login', function (req, res, next) {
  res.render('login', {data: null});
})

router.get('/view/:id', function (req, res, next) {
  res.render('view', {data: req.params.id});
})

如果我把 /:username 路由器放在最后,一切正常。但是,如果有人访问 example.com/view(没有 id),我需要它发送一个错误,即视图控制器没有收到 id。相反,它再次将其视为用户名,而是发送用户名不存在的错误。

解决这个问题的最干净的方法是什么?我只需要为所有基本 url 路径添加一个路由器吗?(像这样):

router.get('/login', function (req, res, next) {
  res.render('login', {data: null});
})

router.get('/view/:id', function (req, res, next) {
  res.render('view', {data: req.params.id});
})

router.get('/view', function (req, res, next) {
  res.render('viewError', {data: null});
})

router.get('/:username', function (req, res, next) {
  res.render('profile', {data: req.params.username});
})

标签: node.jsexpress

解决方案


我不完全确定这是否是正确的方法,但是这听起来像是我可能会遇到的事情,我希望通过这种方法解决它,直到找到更好的解决方案。

下面的解决方案对路径格式使用单一路由/:value,无论是登录名、视图还是任何用户名,因此您可以输入一个简单的 if-else-if 或 switch 以将控制权交给相应的控制器,或者只是从中渲染一个视图。这样,必须处理的顺序根本无关紧要。

router.get("/:username", function(req, res, next) {
  if (req.params.username === "login") {
    res.render("login", { data: null });
  } else if (req.params.username === "view") {
    res.render("viewError", { data: null });
  } else {
    res.render("profile", { data: req.params.username });
  }
});

router.get("/view/:id", function(req, res, next) {
  res.render("view", { data: req.params.id });
});

推荐阅读