如何从wasm模块连接到本地mongodb实例?

时间:2019-06-07 20:13:02

标签: mongodb go webassembly

我正在尝试使用Go编译为WebAssembly将一些数据存储在本地MongoDB实例中。问题是,我什至无法连接到它。 mondog实例不会以任何方式对wasm模块的连接做出反应。仅当从wasm模块连接时才会出现此问题。以普通方式编译时,相同的代码以及从mongo shell进行的连接都可以正常工作。运行的mongod实例没有密码保护。

重要的是,我的操作系统是Windows 10。

我尝试将mongod bind_ip参数从localhost更改为机器的实际本地地址,并使用其他浏览器(Chrome 75.0.3770.80,Opera 60.0.3255.109)。 更改超时时间也无法解决问题。

func connectToMongo(URI string, timeout time.Duration) *mongo.Client {

    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()

    client, err := mongo.Connect(ctx, options.Client().ApplyURI(URI))

    if err != nil {
        log.Fatal(err)
    }

    err = client.Ping(ctx, readpref.Primary())

    if err != nil {
        log.Fatal(err) // It fails here
    }

    return client
}

func main() {
    client := connectToMongo("mongodb://localhost:27017", 20*time.Second)
}

<html>
    <head>
        <script type="text/javascript" src="./wasm_exec.js"></script>
        <script>
            const go = new Go();
            WebAssembly.instantiateStreaming(fetch('main.wasm'),go.importObject).then( res=> {
                go.run(res.instance)    
            })
        </script>
    </head>
</html>

我不带任何参数运行mongod.exe,因此将其绑定到本地主机。

我希望代码能够连接到mongod实例,但是实际上我在浏览器控制台中收到以下错误:“超出了上下文截止时间”。

我仍在学习Go和JavaScript的新手,所以我可能会错过一些非常简单的东西。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您正在尝试从WebAssembly连接到本地服务器,很可能使用浏览器WASM沙箱不允许的协议。

例如,WebAssembly无法从WASM沙箱中打开低级网络套接字,因此在运行时,文件,系统和网络访问方面的限制主要取决于您可以使用JavaScript进行的操作浏览器中的WASM。

值得阅读WebAssembly在安全性和系统访问方面的约束在浏览器上下文中使用时,并且值得注意的是不是WebAssembly阻止了您的连接,而是浏览器正在运行WebAssembly。