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

构建项目后API返回HTML而非JSON,好友列表加载失败求助

问题排查与解决办法

最可能的根源

你遇到的情况90%是后端路由顺序搞反了——静态资源托管的路由优先级比API路由高,导致所有GET请求都被前端的SPA fallback规则捕获,返回了index.html,而不是API接口的JSON数据。毕竟登录、注册这些POST请求不会触发SPA的路由fallback,所以能正常工作。

具体排查步骤

  • 先检查后端路由顺序
    拿Express举例子,正确的写法必须是先定义所有API接口,再托管前端静态文件,最后放SPA的fallback路由:

    // 先挂API路由,比如你的用户列表接口
    app.use('/api/user', userRouter);
    // 再托管build后的静态文件
    app.use(express.static(path.join(__dirname, '../client/build')));
    // 最后处理SPA的路由fallback,只能放最后!
    app.get('*', (req, res) => {
      res.sendFile(path.join(__dirname, '../client/build/index.html'));
    });
    

    如果把API路由写在静态托管之后,那所有GET请求都会被*规则截胡,直接返回index.html。

  • 核对前端请求路径
    确认前端调用/api/user/时的实际请求路径有没有错,比如前端的baseURL配置是否正确,有没有因为build后部署路径变化导致请求路径不对。

  • 检查build脚本和后端静态目录
    确保npm run build生成的静态文件目录和后端托管的目录是同一个,比如package.json里的build脚本:

    "scripts": {
      "build": "react-scripts build"
    }
    

    后端里的路径要准确指向这个build文件夹,别写错了层级。

  • 确认API端点的响应格式
    检查你的getUserList接口代码,确保是用res.json()返回数据,而不是不小心返回了HTML。比如:

    router.get('/', async (req, res) => {
      try {
        const users = await User.find();
        res.json(users); // 必须用json返回
      } catch (err) {
        res.status(500).json({ msg: err.message });
      }
    });
    

    如果接口里错误处理返回了HTML页面,也会出现这个问题。

总结

先去调后端的路由顺序,把API路由放在最前面,这是最常见的解决办法。调完之后用Postman再测一遍/api/user/,应该就能返回JSON了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:58:26