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

React+Express电商项目cart路由访问报404错误排查

问题根因

两个配置错误共同导致404:

  • React Router 路由匹配顺序错误,通配路由提前拦截了购物车路径
  • Axios 接口请求使用无前置斜杠的相对路径,在非根路径下会拼接出错误的请求地址
修复方案

1. 调整路由顺序,精确路径优先

Switch 组件按从上到下的顺序匹配路由,匹配到第一个符合规则的条目就会停止后续匹配。你当前把通配的商品详情路由/:id放在了购物车路由前面,且没有加exact精确匹配,所有/cart开头的路径都会被这个路由提前拦截,把cart识别为商品ID,错误渲染商品详情组件、触发商品详情接口请求。
把更精确的固定路径放在前面,通配路径放在最后,修改App.js代码如下:

function App() {
  return (
    <Switch>
      <Route exact path="/" component={HomePage} />
      <Route exact path="/products" component={ProductPage}/ >
      {/* 购物车路由前移,优先匹配 */}
      <Route exact path="/cart" component={CartPage} />
      <Route path="/cart/:id" component={CartPage} />
      {/* 通配商品详情路由放最后,避免提前拦截 */}
      <Route path="/:id" component={ProductDetail} />
    </Switch>
  )
}

export default App;

2. 修正Axios请求路径为根路径相对地址

你当前所有Axios请求写的是不带开头/的相对路径,浏览器会基于当前页面的URL层级拼接请求地址:

  • 访问根路径/时,请求api/products会被拼接为http://localhost:3000/api/products,能正常走代理到5000端口
  • 访问/cart时,同路径会被拼接为http://localhost:3000/api/products/cart
  • 访问/cart/223时,同路径会被拼接为http://localhost:3000/cart/api/products/cart
    这也是你看到不同路径下报错请求地址不一样的原因。
    给所有请求路径加上前导斜杠,强制从站点根目录拼接地址,修改productActions.js代码如下:
const listProducts = () => async (dispatch) => {
  try {
    dispatch({ type: PRODUCT_LIST_REQUEST });
    // 路径前加/
    const { data } = await axios.get("/api/products");
    dispatch({ type: PRODUCT_LIST_SUCCESS, payload: data });
 } catch (error) {
   dispatch({ type: PRODUCT_LIST_FAIL, payload: error.message });
  }
 };

const detailsProduct = (productId) => async (dispatch) => {
  try {
   dispatch({ type: PRODUCT_DETAILS_REQUEST, payload: productId });
   // 路径前加/
   const { data } = await axios.get(`/api/products/${productId}`);
   dispatch({ type: PRODUCT_DETAILS_SUCCESS, payload: data });
   } catch (error) {
   dispatch({ type: PRODUCT_DETAILS_FAIL, payload: error.message });
    }
  };

export { listProducts, detailsProduct };

3. 检查购物车逻辑的接口配置

从报错信息看,addToCart方法里也发起了接口请求,同样把请求路径改为带前导斜杠的绝对路径即可。另外注意你当前server.js里只定义了/api/products和/api/products/:id两个接口,如果购物车逻辑需要请求/api/products/cart或其他购物车相关接口,需要在Express服务中补充对应接口逻辑,否则接口会返回404。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:15:48