You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express.js中app.use()路径配置疑问:为何访问/test触发Router的/路由

Express中app.use()路径参数与Router匹配逻辑解析

问题根源

你遇到的差异核心在于**app.use()的挂载路径是Router的前缀路径**,Router内部定义的路由是基于该前缀的相对路径,而非直接匹配完整请求路径。

具体来说:

  • 当你执行app.use("/test", router)时,相当于给这个Router的所有路由都加上了/test的前缀。
  • Router里的router.get("/test", ...)对应的完整请求路径是/test/test,而非你以为的/test;
  • Router里的router.get("/", ...)对应的完整请求路径才是/test。

所以当访问http://localhost:3000/test时,实际匹配的是Router中两个路径为"/"的路由,自然输出first /和second /,而不是你预期的test 1和test 2(这两个路由需要访问/test/test才会触发)。

修正方案

如果想让访问/test时触发test 1和test 2,可以选择以下两种方式:

方式一:调整Router内部的路由路径

将Router中对应/test的路由改为"/",使其匹配挂载前缀本身:

const express = require('express');
const router = express.Router()
const app  = express();
const port = 3000;

app.listen(port, ()=>{
    console.log("Running");
})

app.use("/test",router)

// 把原"/test"改为"/",对应完整路径/test
router.get("/",(req,res,next)=>{
    console.log("test 1");
    console.log(req.originalUrl);
    next()
})

router.get("/",(req,res,next)=>{
    console.log("first /");
    console.log(req.originalUrl);
    next()
})

// 同样修改为"/"
router.get("/",(req,res,next)=>{
    console.log("test 2");
    console.log(req.originalUrl);
    next()
})

router.get("/",(req,res,next)=>{
    console.log("second /");
    console.log(req.originalUrl);
    next()
})

方式二:调整app.use()的挂载路径

将Router挂载到根路径"/",这样Router里的"/test"就对应完整请求路径/test:

const express = require('express');
const router = express.Router()
const app  = express();
const port = 3000;

app.listen(port, ()=>{
    console.log("Running");
})

// 挂载到根路径
app.use("/",router)

router.get("/test",(req,res,next)=>{
    console.log("test 1");
    console.log(req.originalUrl);
    next()
})

router.get("/",(req,res,next)=>{
    console.log("first /");
    console.log(req.originalUrl);
    next()
})

router.get("/test",(req,res,next)=>{
    console.log("test 2");
    console.log(req.originalUrl);
    next()
})

router.get("/",(req,res,next)=>{
    console.log("second /");
    console.log(req.originalUrl);
    next()
})

关键总结

  • app.use(path, router)中的path是Router的前缀路径,Router内部所有路由都会与该前缀拼接成最终匹配的完整请求路径。
  • Router内部的路由路径是相对路径,若要匹配前缀路径本身,需将Router内的路由设为"/"。

内容的提问来源于stack exchange,提问作者lineyha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:08:15