Node.js连接MySQL报listen EADDRINUSE 3306端口占用错误求助
根因说明
Error: listen EADDRINUSE: address already in use :::3306 不是MySQL连接异常,是Node.js应用自身尝试绑定监听3306端口时,发现该端口已经被本地MySQL服务占用抛出的端口冲突错误。你之前改MySQL端口、换数据库实例都无效,核心原因是问题根本不出在数据库连接环节,你的Node应用甚至还没执行到连接数据库的逻辑,就因为自身端口绑定失败启动中断了。
修复步骤
- 全局检索项目中所有调用
.listen()方法的代码,重点检查端口传参:绝大多数情况是接入AWS Elastic Beanstalk时,混淆了Web服务监听端口和数据库连接端口的配置,把数据库端口(3306)传给了Web服务的监听方法。
典型错误写法示例:
正确逻辑是Web服务单独监听未被占用的端口(如3000、8080),数据库连接配置中单独传入3306作为数据库连接端口,两个配置项完全独立,不能混用。// 错误:将数据库端口作为Web服务监听端口使用 const SERVICE_PORT = process.env.DB_PORT || 3000 app.listen(SERVICE_PORT) - 清理本地残留配置:检查项目根目录下的
.env文件、.elasticbeanstalk目录下的配置文件,确认是否存在将PORT变量(Elastic Beanstalk默认读取该变量作为Web服务监听端口)设置为3306的配置,这类本地残留配置不会随你删除云端AWS资源自动清除。
快速验证方法:临时注释掉项目中所有数据库连接相关代码,只保留Web服务启动逻辑,如果启动时仍然报3306端口占用,可100%确认是监听端口配置错误,和数据库本身无关。
- 清理残留进程:修复配置后,先杀掉所有后台残留的Node进程,避免旧进程持续占用端口:
Windows环境执行命令:
Mac/Linux环境执行命令:taskkill /f /im node.exepkill -f node - 按顺序重启本地MySQL服务、Node应用即可恢复正常。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

