为什么在调用从 JavaScript 编译为 Wasm 的异步 Rust 函数时字符串参数为空?
Why are string arguments blank when calling an async Rust function compiled to Wasm from JavaScript?
我正在使用 wasm_bindgen 构建的 wasm-pack。我有一个暴露给 JS 的 Rust 函数:
#[wasm_bindgen]
pub async fn validate_registration_token(backend_api_domain: String, token: String) -> Result<JsValue, JsValue> {
console::log_1(&"backend_api_domain=".clone().into());
console::log_1(&backend_api_domain.clone().into());
console::log_1(&"token=".clone().into());
console::log_1(&backend_api_domain.clone().into());
let api_endpoint_get_guest_info = format!(
"{backend_api_domain}/weddings/{token}/guests/registration/{registration_token}",
backend_api_domain = backend_api_domain.clone(),
token = token.clone(),
registration_token = registration_token.clone()
);
console::log_1(&api_endpoint_get_guest_info.clone().into());
let res = reqwest::Client::new()
.get(&api_endpoint_get_guest_info)
.send()
.await
.unwrap();
let text = res.text().await.unwrap();
let promise = js_sys::Promise::resolve(&true.into());
let result = wasm_bindgen_futures::JsFuture::from(promise).await.unwrap();
Ok(result)
}
在HTML/JavaScript中,我调用了Rust函数:
<button
type="button"
class="btn submit"
onclick="wam.validate_registration_token('http://localhost:80', 'mytoken')">
Send
</button>
启动应用程序时,单击 Send
按钮将调用我的 Rust 函数,但两个 String
参数似乎都是空白/缺失。
这是上面函数的控制台跟踪:
backend_api_domain=
token=
/weddings//guests/registration/AAAA
我不确定我做错了什么。我是否应该更改从 JavaScript 调用 Rust 函数的方式?
问题终于解决了!
感谢用户 Pauan 在 rust discord 中的帮助。
我的错误是没有在 JS 中正确初始化 WASM。
the return value from await init('./front_bg.wasm') is the raw WebAssembly exports (which you generally shouldn't use)
whereas the ./front.js module wraps those exports so that they will work properly
so you have to use the functions defined in ./front.js, not the functions returned from init
见https://discordapp.com/channels/442252698964721669/443151097398296587/693385649750933564
将 HTML 中的脚本标记更改为这个:
import init, * as wam from './front.js';
const run = async () => {
await init('./front_bg.wasm');
window.wam = wam;
};
run();
谢谢!
我正在使用 wasm_bindgen 构建的 wasm-pack。我有一个暴露给 JS 的 Rust 函数:
#[wasm_bindgen]
pub async fn validate_registration_token(backend_api_domain: String, token: String) -> Result<JsValue, JsValue> {
console::log_1(&"backend_api_domain=".clone().into());
console::log_1(&backend_api_domain.clone().into());
console::log_1(&"token=".clone().into());
console::log_1(&backend_api_domain.clone().into());
let api_endpoint_get_guest_info = format!(
"{backend_api_domain}/weddings/{token}/guests/registration/{registration_token}",
backend_api_domain = backend_api_domain.clone(),
token = token.clone(),
registration_token = registration_token.clone()
);
console::log_1(&api_endpoint_get_guest_info.clone().into());
let res = reqwest::Client::new()
.get(&api_endpoint_get_guest_info)
.send()
.await
.unwrap();
let text = res.text().await.unwrap();
let promise = js_sys::Promise::resolve(&true.into());
let result = wasm_bindgen_futures::JsFuture::from(promise).await.unwrap();
Ok(result)
}
在HTML/JavaScript中,我调用了Rust函数:
<button
type="button"
class="btn submit"
onclick="wam.validate_registration_token('http://localhost:80', 'mytoken')">
Send
</button>
启动应用程序时,单击 Send
按钮将调用我的 Rust 函数,但两个 String
参数似乎都是空白/缺失。
这是上面函数的控制台跟踪:
backend_api_domain=
token=
/weddings//guests/registration/AAAA
我不确定我做错了什么。我是否应该更改从 JavaScript 调用 Rust 函数的方式?
问题终于解决了! 感谢用户 Pauan 在 rust discord 中的帮助。 我的错误是没有在 JS 中正确初始化 WASM。
the return value from await init('./front_bg.wasm') is the raw WebAssembly exports (which you generally shouldn't use) whereas the ./front.js module wraps those exports so that they will work properly so you have to use the functions defined in ./front.js, not the functions returned from init
见https://discordapp.com/channels/442252698964721669/443151097398296587/693385649750933564
将 HTML 中的脚本标记更改为这个:
import init, * as wam from './front.js';
const run = async () => {
await init('./front_bg.wasm');
window.wam = wam;
};
run();
谢谢!