查 launch.json 的 port 是否被占需先用 lsof -ni :9229(macOS/Linux)或 Get-NetTCPConnection -LocalPort 9229(Windows PowerShell)定位真实 PID,再软杀后清子进程树,而非仅硬杀;同时须检查 package.json scripts、CLI 参数及 NODE_OPTIONS 环境变量是否冲突。

查 launch.json 里写的 port 是不是被占了
VS Code 调试 Node.js 时默认用 9229,但很多项目会改成 9230、9231 甚至硬写成 3000。一旦这个端口被前一次调试残留、Live Server 或其他 Node 进程占着,Debugger for Node.js 就会卡在“正在连接”或直接报 EADDRINUSE。
- 打开项目根目录下的
.vscode/launch.json,确认"port"字段值(比如"port": 9229) - 别只看数字——检查它是否和当前终端里运行的
node --inspect=9229或npm run dev启动参数冲突 - 如果多个项目共用同一份配置模板,容易误把别人改过的
port拷贝过来,导致集体撞车
查系统里谁真正在监听那个 port
别靠任务管理器里“node.exe”名字猜,PID 才是唯一凭证。直接在 VS Code 内置终端(Ctrl + `)执行:
- macOS/Linux:
lsof -ni :9229(把9229换成你实际配置的端口;-n避免 DNS 卡顿,-i只筛网络连接) - Windows PowerShell:
Get-NetTCPConnection -LocalPort 9229 | Select-Object OwningProcess, State(输出中OwningProcess就是 PID) - Windows CMD:
netstat -ano | findstr :9229(注意 PID 是十进制,需在任务管理器“详细信息”页开启“PID”列比对)
如果 lsof 报 command not found,macOS 先跑 xcode-select --install;Linux 可用 sudo apt install psmisc。
杀进程不能只 kill -9 或 taskkill /f /pid
Node 调试进程常拉起子线程(比如 npm、yarn、V8 的 inspector 线程),只杀主 PID 很可能留僵尸监听套接字,端口还是被占。
- macOS/Linux:先
kill 1234(发SIGTERM),等 2 秒无响应再kill -9 1234 - Windows:必须加
/t参数,taskkill /f /t /pid 1234,否则子进程大概率漏杀 - 更彻底清理 VS Code 自家进程:
killall -r "Code Helper|Code|Electron"(macOS/Linux)或taskkill /f /t /im Code.exe && taskkill /f /t /im CodeHelper.exe(Windows)
杀完立刻验证:lsof -i :9229 或 Get-NetTCPConnection -LocalPort 9229 应该无输出。有输出说明还有漏网之鱼。
改端口别只改 launch.json,还得看环境变量和 CLI 参数
有时候你改了 launch.json,重启调试还是报错——因为 Node 进程本身启动时已经绑定了端口,VS Code 只是去连,根本没机会干预。
- 检查
package.json里的scripts,比如"dev": "node --inspect=9229 server.js",这里写的端口优先级高于launch.json - 某些框架 CLI(如
create-react-app)会忽略launch.json,得在终端里显式传参:npm start -- --inspect-port=9230 - 环境变量
PORT或NODE_OPTIONS也可能覆盖配置,比如NODE_OPTIONS="--inspect=9230"会全局生效
真正干净的做法是:删掉所有硬编码端口,让代码支持 process.env.PORT 或 process.env.INSPECT_PORT,再配合 launch.json 里写 "port": ${env:INSPECT_PORT}。


















