go net: LookupHost Protocol not available on nodejs/wasm

biswetbf  于 4个月前  发布在  Go
关注(0)|答案(2)|浏览(54)

你正在使用的Go版本是什么( go version )?

$ go version
go version devel go1.21-fe10464358 Fri May 5 13:20:58 2023 +0000 linux/amd64

这个问题在最新版本的发布中是否重现?

否。在执行了 git bisect 之后,我得到了:

4c5d97990e4a39bd3e903f8e318b7234db3ba91f is the first bad commit
commit 4c5d97990e4a39bd3e903f8e318b7234db3ba91f
Author: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Date:   Fri Jan 27 22:50:54 2023 -0800

    net/http: disable fetch on NodeJS

这是第一个破坏WASM中的http请求的提交。

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env

GO111MODULE=""

GOARCH="amd64"

GOBIN=""

GOCACHE="..."

GOENV="..."

GOEXE=""

GOEXPERIMENT=""

GOFLAGS=""

GOHOSTARCH="amd64"

GOHOSTOS="linux"

GOINSECURE=""

GOMODCACHE="..."

GONOPROXY=""

GONOSUMDB=""

GOOS="linux"

GOPATH="..."

GOPRIVATE=""

GOPROXY=" [https://proxy.golang.org,direct](https://proxy.golang.org,direct) "

GOROOT="..."

GOSUMDB="sum.golang.org"

GOTMPDIR=""

GOTOOLDIR="/.../go/pkg/tool/linux_amd64"

GOVCS=""

GOVERSION="devel go1.21-fe10464358 Fri May 5 13:20:58 2023 +0000"

GCCGO="gccgo"

GOAMD64="v1"

AR="ar"

CC="gcc"

CXX="g++"

CGO_ENABLED="1"

GOMOD="/dev/null"

GOWORK=""

CGO_CFLAGS="-O2 -g"

CGO_CPPFLAGS=""

CGO_CXXFLAGS="-O2 -g"

CGO_FFLAGS="-O2 -g"

CGO_LDFLAGS="-O2 -g"

PKG_CONFIG="pkg-config"

GOGCCFLAGS="-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build3099992878=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

使用以下命令编译WASM二进制文件:

GOOS=js GOARCH=wasm $GOROOT/bin/go build -o main.wasm main.go

然后从WASM二进制文件中调用 http.Client.Do ,它返回以下错误:

http request error: Post "https://some.host/httpgrpc": dial tcp: lookup some.host: Protocol not available

你期望看到什么?

要执行的http查询。

你看到了什么?

一个错误,说tcp不可用。

pxyaymoc

pxyaymoc2#

在go1.22-2eca0b1和node v20.4.0上遇到了相同的问题。以下是详细信息。

gotip version
go version devel go1.22-2eca0b1 Fri Jul 21 21:37:46 2023 +0000 linux/amd64
node --version
v20.4.0

Go代码(GOARCH=wasm,GOOS=js):

resp, err := http.Get("https://www.example.com")
log.Println(resp, err)

JavaScript/Node.js代码:

import './wasm_exec.js';

const go = new Go();

go.run((await WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject)).instance);

输出:

17:16:42.906000 h2_bundle.go:10048: http2: Transport failed to get client conn for www.example.com:443: http2: no cached connection was available
17:16:42.916000 main_js.go:144: <nil> Get "https://www.example.com": dial tcp: lookup www.example.com: Protocol not available

在同一配置下,当前最新版本的go1.20.6可以正常工作。

相关问题