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

Express存在多条路由规则时始终仅匹配根路径问题求助

问题根因

Express 路由会按照代码注册的从上到下顺序匹配,你写的app.get("*")是匹配所有GET请求的通配符路由,如果它的注册顺序在其他业务路由之前,所有请求会优先被这个通配路由拦截,永远不会触发后面的其他路由。

解决步骤

  • 第一步:调整路由注册顺序,所有业务路由、接口路由、认证路由(比如你用到的/auth/sso对应路由)、静态资源托管规则,全部放在这个*通配符路由的前面注册,*路由仅作为兜底放在所有路由的最后面。
    错误顺序示例:
    // 错误:通配路由放在最前面
    app.get("*", (req, res) => { /* 你的代码 */ })
    app.get("/auth/sso", (req, res) => { /* 认证逻辑 */ })
    app.get("/api/user", (req, res) => { /* 接口逻辑 */ })
    
    正确顺序示例:
    // 正确:其他路由全部放在前面
    app.get("/auth/sso", (req, res) => { /* 认证逻辑 */ })
    app.get("/api/user", (req, res) => { /* 接口逻辑 */ })
    app.use(express.static(path.resolve(__dirname, "client", "build")))
    // 通配路由放在最后做兜底
    app.get("*", (req, res) => { /* 你的代码 */ })
    
  • 第二步:优化现有通配路由内的代码执行顺序,res.sendFile执行后就已经向客户端返回响应了,后续修改req.session.url的逻辑会在响应结束后才执行,不会生效,建议调整顺序:
    app.get("*", (req, res, next) => {
      req.session.url = req.url;
      console.log("requested *", req.session.url, req.url);
      if (req.session.user == null) {
          console.log('Went to * SSo',req.session.url, req.url);
          res.redirect("/auth/sso");
      } else {
          console.log('not to * SSo',req.session.url, req.url);
          // 把session修改逻辑移到sendFile前面
          if (req.session.url == '/' || req.session.url == '') {
              req.session.url = '/home'
          }
          res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
      }
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:45:03