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

2023-11-25

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

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

and

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

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


要完全理解这一点,请阅读文档: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 模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当多个路径匹配时,Express 如何知道使用哪个 Router 路径? 的相关文章

随机推荐

  • 内部版本号中的分支名称

    我试图将分支名称放入内部版本号中 但找不到正确的参数 我正在使用内部版本号格式 teamcity build branch 0 它可以工作 但是当它尝试构建默认分支 dev 时 teamcity 将其命名为
  • 如何在 osgi 中从字节反序列化对象

    在我的 osgi 应用程序中 我有三个包 travel api table api and utils travel api依赖于取决于table api这取决于utils 注意travel api不直接依赖于utils 我使用 aQute
  • x86 上哪个写屏障更好:lock+addl 或 xchgl?

    Linux 内核使用lock addl 0 0 esp 作为写屏障 而 RE2 库使用xchgl 0 0作为写屏障 有什么区别 哪个更好 x86 也需要读屏障指令吗 RE2 将其读屏障函数定义为 x86 上的无操作 而 Linux 将其定义
  • 是否可以使用 JavaScript 中的对象文字定义动态命名的属性? [复制]

    这个问题在这里已经有答案了 考虑以下 var a foo bar 相当于 var a a foo bar 相当于 var a a foo bar 相当于 var a var b foo a b bar 是否可以做类似的事情 var b fo
  • 在 Android 上将画布保存为位图

    我在将画布的内容放入位图中遇到一些困难 当我尝试执行此操作时 文件大小约为 5 80KB 但它似乎完全是空的 每个像素都是 000 画布上绘制了一系列由手写形成的相互连接的线条 下面是我的视图的 onDraw 我知道它阻塞了 UI 线程 不
  • JavaScript YAML 解析器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一个 JavaScript YAML 解析器 它将 YAML 转换为 HTML 页面中可用的内容 我在 Github 上尝试过这个版本 h
  • 默认在 Sublime Text 3 中将程序编译为 c++ 14

    我知道我们可以使用 g 编译器将程序编译为 C 但g 编译器默认为98版本 要将其作为 C 14 运行 我们需要添加 std c 14在终端 Sublime Text 因其轻量级和功能而被认为是竞争性编程中有价值的编辑器 在这些比赛中 时间
  • 使用 Rails 4 将自定义字段/列添加到 Devise

    我正在尝试添加一个full name字段 列到我的用户模型 使用devisegem 和 Rails 4 网上大部分例子推荐使用 attr accessible 但听起来在 Rails 4 中应该以不同的方式处理这个问题 我该如何添加full
  • 分配二进制常量

    有没有办法将二进制值赋给 VB 变量 所有显而易见的选择都不起作用 我尝试过添加前缀 B 附加b但似乎没有任何作用 我寻找它的运气也不好 我不need这适用于我的应用程序 但我只是好奇 所以不需要替代解决方案 编辑 为了澄清起见 我正在寻找
  • 使用 colspan 设置 下 的宽度

    我想设置宽度td in tbody在下面thead具有colspan 2 具有硬定义的列宽 以 为单位 浏览器外壳不会动态调整表格宽度 sample width 100 table layout fixed sample td nth ch
  • java: wait()、notify() 和同步块

    我了解到调用对象的wait 方法将释放对象监视器 如果存在 但我有一些关于打电话的问题notify 另一个线程在此对象上 如果另一个 第三个 线程同时拥有对象监视器 何时 等待线程会醒来吗 如果第三个线程调用 等待线程会被唤醒吗wait 在
  • Ant 中出现“无法创建任务或输入 antlib:org.apache.maven.artifact.ant:mvn”错误

    运行 ant 任务时 Ant 构建无法运行build xml 我在控制台中收到以下错误 Buildfile F Eclipse Projects my project build xml typedef Could not load def
  • 在 Angular 中同步调用一个又一个的可观察对象

    我可以拨打以下服务电话 产品服务 GetAllProducts 产品服务 删除产品 产品服务 GetCategories 产品服务 DeleteCategory 在 sudo 代码中 我需要在组件中执行以下操作 使用productServi
  • 设置 UDP 套接字的源 IP

    我有一个绑定到 INADDR ANY 的 UDP 套接字 用于侦听我的服务器拥有的所有 IP 上的数据包 我通过同一个套接字发送回复 现在 当数据包发出时 服务器会自动选择哪个IP用作源IP 但我希望能够自己设置传出源IP 有没有办法做到这
  • Firebase Firestore REST 示例

    您好 我正在编写一个使用 firebase firestore 并将一些 json 写入 firestore 中的特定集合的脚本 我已经使用实时数据库完成了此操作 但 firestore 有点不同 下面是我的实时数据库片段 curl X P
  • 当另一个输入焦点时,contenteditable div 失去选择

    我对 contenteditable div 有疑问 当我想在其上执行一个简单的命令 如粗体或斜体 时 我执行以下操作 记住div 因为点击粗体按钮后它会失去焦点 单击按钮时 我重新聚焦 div 并执行粗体命令 一切正常 现在 当我尝试做更
  • 如何在 Ecto 迁移中运行更新?

    I use Phoenix and Ecto在我的一个项目中 我想向一个表添加一列 并且我希望它是一个NOT NULL柱子 但我已经有一些现有的数据 所以我决定添加列 将所有行更新为某个值并将列修改为NOT NULL 我尝试了这两个代码 s
  • 何时在 Swift 中使用全局变量

    我正在学习 Swift 和 iOS 应用程序开发 我想知道在哪些情况下 如果有的话 我应该在 iOS 应用程序中使用全局变量和常量 全局变量是在任何函数 方法 闭包或类型上下文之外定义的变量 局部变量是在函数 方法或闭包上下文中定义的变量
  • Git 推送到 Windows 共享失败

    我正在尝试从本地存储库推送到位于 Windows 共享中的远程存储库 我将重新创建一个简单的场景 其中 c 是我的本地硬盘 n 是映射的网络驱动器 并向您展示我遇到的错误 创建本地存储库 user PC W7 c More git git
  • 当多个路径匹配时,Express 如何知道使用哪个 Router 路径?

    假设有2个router route 例如 router route app id get funtion req res next console log id route and router route app username get