我正在开发一个使用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
,所以在我的情况下可能无法使用reqwest
:wasm-pack build report error: could not compile net2
有没有一种方法可以使同步HTTP请求可以成功地打包为wasm-pack
?
2条答案
按热度按时间egmofgnx1#
它不会像你期望的那样容易工作:WASM字节码是在一个受保护的环境中执行的,不需要访问任何操作系统功能,如磁盘,网络,传统的随机生成器和任何其他类型的I/O。
不幸的是,您的代码(例如文件访问)通常甚至会静默编译,然后在运行时以神秘的方式失败。这不是您使用Rust的习惯,也是当前Wasm Rust堆栈的主要缺点。
要访问操作系统功能,您需要WASI (Wasm System Interface)作为扩展。要在NodeJs中启用Wasi,您可以使用类似WasmerJs的东西,请参阅例如this article提供的简短摘要。
oug3syen2#
Reqwest版本0.11编译为wasm。
下面是一个async示例:
你可以从一个非异步函数运行它,但不能得到返回结果,因为spawn_local返回()。
用
wasm-pack test --chrome
测试。如果你的项目中有时雄,在wasm build中禁用它,因为它使用net2。