3

我正在使用 Rust 开发一个 NODE JS 包并wasm-pack进行编译,我需要在我的代码中发出 HTTP 请求。我尝试使用reqwest库,所以在测试中一切正常,但在打包时出现错误。

#![allow(non_snake_case)]

use reqwest;
use wasm_bindgen::prelude::*;

// function
#[wasm_bindgen]
pub fn makeGetRequest(url: &str) -> String {
    let mut resp = reqwest::get(url).unwrap();
    resp.text().unwrap()
}

// test
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_makeGetRequest() {
        let url = "https://stackoverflow.com/";
        let body = makeGetRequest(url);
        assert!(body.len() > 0);
    }
}

配置Cargo.toml

...

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2"
reqwest = "0.9"

我使用以下命令打包项目:

wasm-pack build --release --target nodejs

我得到了错误:

...
error: could not compile `net2`

我发现它看起来net2不支持wasm-pack,所以也许我不能reqwest在我的情况下使用:wasm-pack build 报告错误:无法编译`net2`

有没有办法可以wasm-pack成功打包同步 HTTP 请求?

4

1 回答 1

3

它不会像您期望的那样容易工作:WASM 字节码在受保护的环境中执行,无需访问任何操作系统功能,如磁盘、网络、传统随机生成器和任何其他类型的 I/O。因此,当您将使用此类功能的任何 Rust 代码编译到 Wasm 中时,它就无法工作。

不幸的是,您的代码(例如文件访问)通常甚至会静默编译,然后在运行时以神秘的方式失败。这不是你习惯使用 Rust 的方式,也是当前 Wasm Rust 堆栈的一个主要缺点。

要访问操作系统功能,您需要WASI(Wasm 系统接口)作为扩展。要在 NodeJs 中启用 Wasi,您可以使用 WasmerJs 之类的东西,例如,请参阅本文提供的简短摘要。

于 2021-02-27T19:37:28.473 回答