Axios GET请求在Heroku部署后返回空白响应,POST请求正常
解决Heroku部署后Axios GET请求返回空白HTML(304状态)的问题
核心原因:SPA路由与API路由优先级冲突
你的问题大概率是React单页应用(SPA)的静态文件托管配置拦截了GET请求,而POST请求不受此规则影响。
当在Heroku部署全栈应用时,如果后端(比如Express)最后配置了SPA fallback路由:
// 托管前端静态文件 app.use(express.static(path.join(__dirname, 'client/build'))); // 所有未匹配的GET请求返回index.html(SPA路由用) app.get('*', (req, res) => { res.sendFile(path.join(__dirname, 'client/build', 'index.html')); });
这段代码会把所有未被API路由匹配的GET请求都返回前端的index.html,导致你的/create/get-users GET请求被拦截,返回空白HTML(实际是前端入口文件),状态码304是浏览器或Heroku缓存机制导致的“未修改”响应。
而POST请求不会被app.get('*')捕获,所以能正常到达后端API路由并返回正确响应。
解决方案
1. 调整路由定义顺序
确保所有API路由在静态文件托管和SPA fallback路由之前定义:
// 先定义API路由 app.use('/create', yourRouter); // 再托管静态文件 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请求,只有无匹配的GET请求才会返回前端index.html。
2. 禁用API GET请求的缓存
针对304状态码问题,在GET路由中添加禁用缓存的响应头,避免浏览器或Heroku缓存错误响应:
router.route('/get-users').get((req,res) => { // 添加缓存控制头 res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0' }); res.json("yes") })
3. 验证环境变量配置
确认Heroku上的REACT_APP_baseServerurl环境变量配置正确,检查路径是否存在多余斜杠或错误(比如是否末尾带/导致请求路径变为//create/get-users),不过因POST请求正常,此问题概率较低,可作为辅助排查项。
内容的提问来源于stack exchange,提问作者Alister Xavier
相关产品推荐
相关产品推荐

