引入mysql2导致生产环境Express与React路由冲突问题求助
解决Express+mysql2生产环境下前端子路由刷新503问题
检查mysql2初始化的错误处理与阻塞问题
生产环境503大概率是mysql2初始化时抛出未捕获异常,导致服务器进程异常无法响应请求。- 改用mysql2的promise版本,将连接逻辑封装到异步函数中,用try/catch捕获错误,避免阻塞服务器启动:
const mysql = require('mysql2/promise'); let dbConnection; async function initDatabase() { try { dbConnection = await mysql.createConnection({ host: '你的生产环境数据库地址', user: '数据库用户名', password: '数据库密码', database: '数据库名' }); console.log('数据库连接成功'); } catch (err) { console.error('数据库连接失败:', err); // 不要直接终止进程,确保服务器仍能响应前端路由请求 } } initDatabase(); // 异步初始化,不阻塞路由注册 - 禁止在路由注册前写同步的数据库连接代码,否则连接失败会直接导致服务器无法启动。
- 改用mysql2的promise版本,将连接逻辑封装到异步函数中,用try/catch捕获错误,避免阻塞服务器启动:
调整路由与数据库代码的执行顺序
正确的代码执行顺序应为:- 初始化Express实例
- 注册静态文件服务(
app.use(express.static('build'))) - 注册后端API路由
- 注册通配路由返回
index.html(支持React Router) - 异步初始化数据库连接
这样即使数据库连接失败,服务器依然能正常返回前端页面,不会出现503错误。
排查生产环境错误日志
- 开启进程级异常捕获,记录未处理错误:
process.on('uncaughtException', (err) => { console.error('未捕获异常:', err); }); process.on('unhandledRejection', (reason, promise) => { console.error('未处理的Promise拒绝:', reason); }); - 查看服务器进程管理工具(如pm2)的日志,确认是否存在数据库连接参数错误(比如生产环境数据库地址、端口、权限配置与本地不一致)。
- 开启进程级异常捕获,记录未处理错误:
关于切换到Sequelize的建议
Sequelize默认使用mysql2作为驱动,所以如果核心问题是mysql2的连接错误或初始化逻辑问题,切换ORM无法直接解决。如果要切换,同样需要确保Sequelize的初始化是异步的,且有完善的错误处理,避免阻塞服务器启动。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

