3

我正在使用用 wasm-pack 构建的 wasm_bindgen。我有一个向 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 函数的方式吗?

这是重现的完整代码示例

4

1 回答 1

2

终于设法解决了这个问题!感谢用户 Pauan 在 rust discord 中的帮助。我的错误是没有在 JS 中正确初始化 WASM。

await init('./front_bg.wasm') 的返回值是原始 WebAssembly 导出(通常不应该使用),而 ./front.js 模块包装了这些导出,以便它们能够正常工作,所以你必须使用 ./front.js 中定义的函数,而不是从 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();

谢谢 !

于 2020-03-28T09:13:35.877 回答