Node.js连接WSL Ubuntu上的Kafka 3.0.0报ECONNREFUSED错误如何解决?
解决方案
核心根因
该问题大多由WSL2的NAT网络隔离特性导致:WSL2拥有独立的虚拟网卡,与Windows侧的127.0.0.1本地回环地址不互通,且Kafka的监听和广播地址配置不正确也会导致连接失败。
分步排查修复
第一步:确认Node.js运行环境
先明确你的Node.js代码运行位置,对应不同方案:
场景A:Node.js运行在Windows侧,Kafka运行在WSL Ubuntu
- 获取WSL实例的内网IP
在WSL Ubuntu终端执行命令:hostname -I
输出的第一个IP就是WSL的可访问内网IP,格式通常为172.xx.xx.xx。 - 修改Kafka配置文件
server.properties
# 监听所有网卡的请求,允许WSL外部的Windows侧访问 listeners=PLAINTEXT://0.0.0.0:9092 # 对外广播的Kafka地址,填写上一步获取的WSL内网IP advertised.listeners=PLAINTEXT://<替换为你的WSL内网IP>:9092
- 修改Node.js代码里的brokers配置
把brokers: ["127.0.0.1:9092"]改为brokers: ["<替换为你的WSL内网IP>:9092"] - 重启Kafka服务即可正常连接。
如果不想每次WSL重启后IP变化都修改配置,可以在Windows管理员权限终端执行端口转发命令,实现Windows侧127.0.0.1:9092直接转发到WSL对应端口:netsh interface portproxy add v4tov4 listenport=9092 listenaddress=0.0.0.0 connectport=9092 connectaddress=<替换为你的WSL内网IP>
场景B:Node.js和Kafka都运行在WSL Ubuntu
- 先在WSL终端测试端口连通性,执行命令:
nc -zv 127.0.0.1 9092
如果返回连接成功,说明端口正常,检查你的Node.js依赖是否正确安装,kafkajs版本是否兼容Kafka 3.0.0。 - 如果端口不通,检查WSL内部是否有防火墙规则拦截,或者Kafka启动日志是否有报错。
额外注意
你的代码中producer.send方法参数存在错误,topics字段应为单数topic,后续发送消息时需要修正:
await producer.send({ topic: "hashtags", // 原代码这里写错为topics messages: [ { value: name } ] })
内容的提问来源于stack exchange,提问作者CapBul
相关产品推荐
相关产品推荐

