vscode调试报connection refused,首要排查windows防火墙入站规则是否放行对应调试端口;需通过“高级安全windows defender防火墙”新建tcp端口规则,勾选域/专用/公用配置文件,并确保launch.json中address与node监听地址一致。

VSCode调试时Connection refused,先确认是不是入站端口被拦
VSCode 启动 Node.js 调试(比如用 debugpy、node --inspect 或 attach 模式)失败,报 Connection refused,大概率不是代码或配置写错了,而是 Windows 防火墙默认拦截了调试进程监听的入站端口——它根本没机会响应连接请求。
验证方法:在终端手动启动带调试端口的服务,例如:node --inspect=9229 index.js,然后立刻执行:netstat -ano | findstr :9229。如果没输出,说明端口根本没起来;如果有输出但 VSCode 连不上,且你确定 address 填的是 localhost 或目标 IP,那基本就是防火墙在丢包。
- 不要只查“VSCode 是否被放行”,
Code.exe出站规则对调试无效——入站流量由 Node 进程(如node.exe)监听端口触发,防火墙按端口判别,不是按发起程序 - WSL2 场景下尤其容易踩坑:WSL2 的 IP 对 Windows 来说是外部地址,必须走入站规则,哪怕你写的是
localhost - 端口号必须和
launch.json里port字段或命令行参数完全一致,比如用了--inspect=5679,就得为5679单独建规则
Windows 防火墙入站规则怎么配才真正生效
必须通过「高级安全 Windows Defender 防火墙」新建端口规则,不能只靠“允许应用通过防火墙”那种粗粒度设置。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 打开「高级安全 Windows Defender 防火墙」→ 左侧点「入站规则」→ 右侧「新建规则」→ 选「端口」→ 协议选 TCP → 输入具体端口号(如
9229、5678、2345) - 操作选「允许连接」,配置文件务必勾选「域」「专用」「公用」——除非你 100% 确认只用其中一种网络类型
- 规则名称建议带上用途,比如
vscode-node-inspect-9229,方便后续排查或批量管理 - 设完后重启 VSCode 并彻底杀掉所有残留进程(任务管理器里清空
Code.exe和Code Helper (Renderer).exe),否则旧网络栈可能缓存旧策略
launch.json 中 address 字段填 localhost 还是 0.0.0.0?
填错会导致 VSCode 连错地址,或者远程进程拒绝绑定,看起来像防火墙问题,其实是配置错位。
- 本地调试(Node 进程也在 Windows 上运行):
"address": "localhost"—— 正确。此时node --inspect默认绑定127.0.0.1,VSCode 从本机连过去 - WSL2 调试(Node 在 WSL2 里,VSCode 在 Windows):
"address": "localhost"—— 依然正确。WSL2 已实现 localhost 端口自动映射,只要入站规则开了,Windows 就能透传 - 真远程(比如树莓派、云服务器):
"address": "192.168.1.100"或实际 IP —— 必须显式填目标 IP。填localhost会让 VSCode 去连自己本机,永远连不上 -
"address": "0.0.0.0"是服务端绑定用的,不是 VSCode 客户端该填的值;填了反而可能因安全策略被拒
Node 进程监听端口失败的常见干扰项
即使防火墙规则全开,Connection refused 仍可能出现,得逐层排除。
- 端口被占:启动前执行
netstat -ano | findstr :9229,若已有 PID 占用,要么杀掉它,要么换端口 - Node 进程没真正启动:检查终端输出是否有
Debugger listening on ws://127.0.0.1:9229/...,没有就说明调试参数没生效或入口文件路径错 - WSL2 下未启用端口转发:确保 Windows 端已运行
wsl --shutdown再重启,避免旧网络状态残留 - 某些杀毒软件(如火绒、360)会主动拦截
node.exe监听行为,需在自定义防护中放行其“创建本地监听端口”动作
最易被忽略的一点:入站规则必须针对端口,而不是程序;且 WSL2 场景下,这个规则不是可选项,是必选项——没有它,localhost 映射也走不通。










