Nodejs express在路由中使用通配符的问题

Nodejs express在路由中使用通配符的问题

Ndde即学即用中有这一段: app.get(’/b*/c*d’, function(req,res) { res.send(‘b’); }); 上面这段代码 匹配 /b/cd /b/cfood /b//c/d/ 等。为什么他们可以匹配? 不匹配 /b/c/d/foo 为什么这个又不匹配,我不知道为什么。*又代表什么含义?求指点。

2 回复

Node.js Express 在路由中使用通配符的问题

在 Express 中,路由模式中的 *? 是用于匹配 URL 路径中的任意字符或零个到多个字符的通配符。理解这些通配符的工作原理对于正确配置路由至关重要。

示例代码解释

const express = require('express');
const app = express();

// 定义路由
app.get('/b*/c*d', (req, res) => {
    res.send('匹配成功');
});

// 启动服务器
app.listen(3000, () => {
    console.log('服务器运行在 http://localhost:3000');
});

通配符 *? 的含义

  • *:表示零个或多个任意字符。
  • ?:表示零个或一个任意字符。

示例解释

  1. 匹配 /b/cd, /b/cfood, /b//c/d/

    • /b*/c*d 这个路由模式中的 * 表示任意字符的零个或多个。因此,/b*/c*d 可以匹配以下几种情况:
      • /b/cdb 后面跟零个或多个字符(实际为零个),c 后面跟任意字符 d
      • /b/cfoodb 后面跟零个或多个字符(实际为零个),c 后面跟任意字符 food
      • /b//c/d/b 后面跟零个或多个字符(实际为两个 /),c 后面跟任意字符 d
  2. 不匹配 /b/c/d/foo

    • /b*/c*d 这个路由模式无法匹配 /b/c/d/foo,因为:
      • /b*/c*d 中的 * 要求 b 后面的字符可以是任意数量的任意字符,而 /b/c/d/foo 中的路径结构不符合这种模式。具体来说,/b/c/d/foo 中的 / 分隔符不符合 * 的定义。

总结

* 通配符用于匹配零个或多个任意字符,而 ? 用于匹配零个或一个任意字符。理解这些通配符的含义和用法可以帮助你更好地配置 Express 路由。

希望以上解释能帮助你理解为什么某些路径会被匹配,而其他路径不会被匹配。如果你有更多问题,欢迎继续提问!


在Express中,* 并不是一个真正的通配符,而是一种用于匹配路径片段的正则表达式语法。具体来说,* 表示匹配前面的模式零次或多次。

在你的例子中,/b*/c*d 实际上是一个正则表达式:

  • b* 表示 b 可以出现零次或多次。
  • c*d 表示 c 出现一次,后面可以跟随零个或多个 d

因此,/b/cd, /b/cfood, 和 /b//c/d/ 都能匹配,因为它们都符合这个模式:

  • /b/cd: b 出现一次,c 出现一次,d 出现一次。
  • /b/cfood: b 出现一次,c 出现一次,f 出现一次,o 出现两次,od 一起出现一次。
  • /b//c/d/: b 出现零次或多次(这里的 b 出现了零次),c 出现一次,d 出现零次或一次(这里 d 出现了一次)。

但是,/b/c/d/foo 不匹配的原因是 * 只能在正则表达式中使用,并且它不能跨多个斜杠 (/)。例如,/b*/c*d 无法匹配 /b/c/d/foo,因为在 c*d 中没有匹配到 /d/ 的模式。

如果你想要匹配更多情况,你可以使用更复杂的正则表达式,例如:

app.get(/\/b(?:\/.*)?\/c(?:\/.*d)?/, function(req, res) {
    res.send('b');
});

这个正则表达式将允许 bc 之间有更多的内容,并且 c 后面可以跟任意内容,直到 d 出现。这样,/b/c/d/foo 将会被匹配到。

如果你只是想简单地匹配任何路径,并且只关心 /b/c 这两个固定的路径部分,可以考虑简化为:

app.get('/b/:rest1/c/:rest2', function(req, res) {
    res.send('b');
});

在这个例子中,:rest1:rest2 是动态的部分,可以捕获任意内容。

回到顶部