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

最後に問題を修正することができました! Rust Discord のユーザー Pauan の助けに感謝します。私の間違いは、JS で WASM を適切に初期化しないことです。

await init('./front_bg.wasm') からの戻り値は生の WebAssembly エクスポート (通常は使用しないでください) ですが、./front.js モジュールはこれらのエクスポートをラップして適切に動作するようにする必要があるため、 init から返される関数ではなく、./front.js で定義された関数を使用します

https://discordapp.com/channels/442252698964721669/443151097398296587/693385649750933564を参照

HTML の script タグを次のように変更しました。

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 に答える