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

React Redux SSR项目导航请求出现bundle.js路径报错该如何解决?

问题根因

首次请求页面时,服务端返回的SSR渲染HTML中如果使用相对路径引入bundle.js,浏览器会基于当前页面的路由路径发起资源请求,例如访问/list/123时会请求/list/bundle.js。express.static中间件在public目录下找不到对应路径的资源,就会继续向下执行,触发你配置的app.get('*')全匹配SSR路由,将bundle.js当作列表ID参数解析,最终引发报错。

解决方案

1. 修正静态资源引用路径

修改HTML模板中bundle.js的引入地址为绝对路径,确保不管在哪一级路由下,浏览器都会请求根路径下的静态资源:

<!-- 错误写法 -->
<script src="bundle.js"></script>
<!-- 正确写法 -->
<script src="/bundle.js"></script>

修改后express.static可以直接命中public目录下的bundle.js,不会再走到后续SSR路由逻辑中。

2. 新增静态资源过滤逻辑

可以在SSR路由最前面新增请求过滤,直接拦截所有静态资源类请求,避免进入SSR逻辑:

app.get('*', (req, res) => {
  // 新增:拦截静态资源请求直接返回404
  if (req.path.match(/\.(js|css|png|jpg|jpeg|gif|ico|svg)$/)) {
    return res.status(404).send('Not Found')
  }
  const store = createStore(req);
  // 原有逻辑不变
})

3. 优化路由参数提取逻辑

不需要手动切割路径获取参数,matchRoutes返回结果中已经包含了解析好的路由参数,直接取用即可,避免路径切割错误:

const promises = matchRoutes(Routes, req.path)
  // 解构获取match参数
  .map(({ route, match }) => {
    console.log("Looking at Route: ", route);
    if (route.loadData) {
      // 直接取用解析后的id参数
      return route.loadData(store, match.params.id)
    }else{
      return null
    }
  })
  // 原有Promise包装逻辑不变
  .map(promise => {
    if (promise) {
      return new Promise((resolve, reject) => {
        promise.then(resolve).catch(resolve);
      });
    }
  });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:15:04