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
相关产品推荐
相关产品推荐

