You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang WASM SDK连接NATS WebSocket(ws://)失败求助

问题分析与解决方案

你的问题核心是NATS Go客户端在WASM环境下未启用WebSocket支持,导致传入ws:// URL时仍尝试建立TCP连接,而非WebSocket连接,最终触发Connection refused错误(因为你的NATS服务器8080端口是WebSocket监听端口,不接受TCP连接)。

关键原因

NATS Go客户端的WebSocket驱动默认关闭,需要通过**构建标签websocket**显式启用。如果编译WASM时未添加该标签,客户端会忽略ws://协议, fallback到TCP连接逻辑,这就是你看到错误的直接原因。

解决方案

1. 编译WASM时添加websocket构建标签

修改编译命令,添加-tags=websocket参数,确保NATS客户端编译时包含WebSocket驱动代码:

GOOS=js GOARCH=wasm go build -tags=websocket -o main.wasm your-entry-file.go

该标签会让客户端正确识别并处理ws:///wss://协议,不再尝试TCP连接。

2. 验证服务器WebSocket配置(可选)

虽然你提到NATS CLI可通过ws://连接,仍建议确认NATS服务器的WebSocket配置是否正确(nats.conf):

websocket {
    port: 8080
    # 跨域场景需配置允许的源
    allowed_origins: ["http://localhost:8000"] # 替换为你的Web应用域名
}

若Web应用与NATS服务器不在同一域名下,必须配置allowed_origins避免跨域拦截(你提到普通WebSocket连接正常,此步骤可能已完成)。

3. 优化NATS连接配置(可选)

可在连接选项中显式指定WebSocket参数,适配WASM环境:

// 在InitNATS函数的opts中添加
import "github.com/nats-io/nats.go/websocket"

opts = append(opts, nats.WithWebSocketOptions(&websocket.Dialer{
    HandshakeTimeout: 30 * time.Second,
    // 按需添加代理等配置
}))

验证步骤

  1. 重新编译WASM文件并替换原文件
  2. 刷新Web页面,点击初始化按钮,观察连接状态
  3. 检查浏览器控制台网络请求,确认是否发起了WebSocket握手请求(而非TCP连接)

内容的提问来源于stack exchange,提问作者Thushar M Prakash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:47:27