NodeJS 如何在Rust中的wasm_bindgen函数中发出HTTP请求?

jaxagkaj  于 2023-04-11  发布在  Node.js
关注(0)|答案(2)|浏览(140)

我正在开发一个使用Rust和wasm-pack编译的NODE JS包,我需要在我的代码中发出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`

我发现wasm-pack似乎不支持net2,所以在我的情况下可能无法使用reqwestwasm-pack build report error: could not compile net2
有没有一种方法可以使同步HTTP请求可以成功地打包为wasm-pack

egmofgnx

egmofgnx1#

它不会像你期望的那样容易工作:WASM字节码是在一个受保护的环境中执行的,不需要访问任何操作系统功能,如磁盘,网络,传统的随机生成器和任何其他类型的I/O。
不幸的是,您的代码(例如文件访问)通常甚至会静默编译,然后在运行时以神秘的方式失败。这不是您使用Rust的习惯,也是当前Wasm Rust堆栈的主要缺点。
要访问操作系统功能,您需要WASI (Wasm System Interface)作为扩展。要在NodeJs中启用Wasi,您可以使用类似WasmerJs的东西,请参阅例如this article提供的简短摘要。

oug3syen

oug3syen2#

Reqwest版本0.11编译为wasm。

# Cargo.toml
[dependencies]
reqwest = { version = "0.11" }

下面是一个async示例:

async fn fetch(url: &str) -> String {
    let client = reqwest::Client::new();
    let resp = client.get(url).send().await.unwrap();
    resp.text().await.unwrap()
}

你可以从一个非异步函数运行它,但不能得到返回结果,因为spawn_local返回()。

mod tests {
    use wasm_bindgen_futures::spawn_local;
    use wasm_bindgen_test::*;
    
    wasm_bindgen_test_configure!(run_in_browser);
    
    async fn fetch(url: &str) -> String {
        let client = reqwest::Client::new();
        let resp = client.get(url).send().await.unwrap();
        resp.text().await.unwrap()
    }
    
    #[wasm_bindgen_test]
    fn fetch_test() {
        spawn_local(async move {
            let result = fetch("https://ifconfig.me/ip").await;
            wasm_bindgen_test::console_log!("Your IP: {}", result);
        });
    }
}

wasm-pack test --chrome测试。
如果你的项目中有时雄,在wasm build中禁用它,因为它使用net2。

# Cargo.toml
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
tokio = { version = "1.0", features = ["full"] }

相关问题