当多个路径匹配时,Express 如何知道使用哪个路由器路径?

Posted

技术标签:

【中文标题】当多个路径匹配时,Express 如何知道使用哪个路由器路径?【英文标题】:How does Express know which Router path to use when multiple paths match? 【发布时间】:2015-10-16 10:31:39 【问题描述】:

假设有2个router.route(),例如:

router.route('/app/:id').get(funtion(req, res, next)
    console.log("id route")
);

router.route('/app/:username').get(funtion(req, res, next)
    console.log("user route")
);

GET /app/nsuzuki被调用时,它使用了哪个router.route(),为什么?

【问题讨论】:

快速工作中的路线首先匹配,基于它们的加载顺序。 如果我需要两条路线都存在怎么办?有没有办法解决这个问题,或者该特定路径只能存在 1 个参数路由? 如果您需要这样,您的应用程序中存在严重的设计缺陷.. 看看这个issue 【参考方案1】:

要完全理解这一点,请阅读文档:http://expressjs.com/api.html#router.METHOD

Express Routes 如何捕获路径

当您将:param 用作路径的一部分时,它会匹配/* 之类的所有内容,并且捕获的值存储在req.params.param 中。

当您有多个规则时,第一个注册的规则就是第一个检查的规则。它会根据每个规则检查每个调用,直到找到匹配项。如果您在没有传递任何值的情况下调用 next(),它将寻找下一个匹配项(在同一路由中,或者继续进入下一个中间件)。

所以这三个规则都会运行

var handleRoute = function(req, res, next)
   console.log(req.path + ' ' + req.params.id + ' ' + req.params.user + ' ' + req.params[0]);
   next();


route.route('/user/:id').get(handleRoute);
route.route('/user/:user').get(handleRoute);
route.route('/user/*').get(handleRoute);

当我请求/user/foobar 时,我会看到以下输出(作为客户端,我可能会出错,因为我从未回应:P)

/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar

这三个都会命中,但每个的上下文都不同。

如何使用正则表达式捕获路径模式

如果您想为 id(假设所有数字)和用户名(所有字母)捕获单独的路由,您可以这样做:

var handleRoute = function(tag) 
  return function(req, res, next) 
    console.log(tag + ' ' + req.path + ' -> ' + req.params[0]);
    res.status(200)
      .json(
        success: 'yay!'
      );
  ;
;

route.route(/^\/user\/([0-9]+)$/i)
  .get(handleRoute('id'));
route.route(/^\user\/([A-Za-z]+)$/i)
  .get(handleRoute('user'));
route.route('/user/*')
  .get(handleRoute('catch all'));

注意我的捕获组周围的反义词。没有这个,params 是空的。它会自动捕获字符串中的*,因为他们是好人。当我针对三种不同类型运行时,我会得到以下输出。

id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1

所有这些都解释了,您正在向一些向量敞开大门,让错误感染您的系统。可能需要考虑一下您的 URL 模式。

【讨论】:

感谢克里斯的大力帮助 :) 非常感谢 没问题。 Express 有很多功能,最初可能会令人困惑,但实际上它只是解构管道如何工作的问题。如果您想了解细节是如何工作的,只需实现文档中的所有示例总是很有趣。

以上是关于当多个路径匹配时,Express 如何知道使用哪个路由器路径?的主要内容,如果未能解决你的问题,请参考以下文章

java 当一个接口被多个类继承时 如何知道是调用的哪个类的实现

使用 Express 设置 React 路由器

Express路由路径匹配规则以及第三方包模块cors

UIBarButtonItem 如何知道 UIToolBar 使用哪个 UIBarStyle?

单击功能上的多个选择器,如何知道单击了哪个选择器?

如何使用 express req 对象获取请求路径