MERN应用部署Heroku后浏览器刷新路由异常问题求助
解决MERN单页应用Heroku部署后刷新页面异常的问题
问题原因
生产环境刷新页面时,浏览器直接向服务器请求当前客户端路由(比如/about),而你的Express服务器优先匹配了同名的API路由,没有返回React的index.html,导致页面显示API的默认响应,而非客户端路由渲染的视图。
解决方案
给API路由添加统一前缀
为所有API路由加上/api前缀,避免和客户端路由路径冲突。修改API路由注册代码:// 替换原API路由注册代码 app.use('/api', AboutRoutes.router); app.use('/api', DogsRoutes.router); app.use('/api', ResultsRoutes.router); app.use('/api', UserRoutes.router);同时修改每个路由文件内的路径定义,比如
AboutRoutes里的路由从router.get('/about', ...)保持不变(此时完整API路径为/api/about),确保客户端路由的/about不会被服务器误判为API请求。验证静态文件路径正确性
Heroku环境下__dirname的指向可能和本地不同,调整sendFile的路径,避免找不到index.html:if (process.env.NODE_ENV === 'production') { app.use(express.static(path.join(__dirname, '../client/build'))); app.get('*', (req, res) => { res.sendFile(path.join(__dirname, '../client/build/index.html')); }); };(如果你的服务器代码在项目根目录的
src文件夹下,需要用../回退到根目录来找到client/build)确保路由顺序正确
保持现有路由顺序:先注册所有API路由,再注册静态文件中间件和catch-all路由(app.get('*', ...)),这样服务器会优先处理API请求,非API请求全部返回React的入口文件,交由客户端路由处理。
内容的提问来源于stack exchange,提问作者Misha Krul
相关产品推荐
相关产品推荐

