Open4
Rust WASM API 作成、Nodeから実行

概要
- Rust WASM + node , API 作成する試作的な内容になります。
[ 公開 2025/06/20 ]
関連
環境
- rustc 1.87.0
- cargo 1.87.0
- wasm-pack
- ubuntu 22 (windows WSL)
- node 20
- express.js
書いたコード
- wasm-pack install
cargo install wasm-pack
- start
npm i
npm run build:wasm
npm run dev
- handler-wasm-1/src/index.js
- GETの場合 / の場合、文字レスポンスを返却
const wasm = require('./wasm_module'); // wasm-pack の出力を参照
app.post('/greet', (req, res) => {
const name = req.body.name || 'Anonymous';
const message = wasm.greet(name);
res.send({ message });
});
app.get('/', (req, res) => {
const message = wasm.greet("WASM");
res.send(message);
});
Vercel デプロイ , Rust WASM API
- 今回は、Github経由でデプロイする例です。
- vercel.json使います。
npm i
npm run build:wasm
npm run dev
- node_modules , target フォルダ以外は、 pushします。
- vercelから、インポートすると、デプロイできました。

ルーティング、Rust WASM API
- ルーティング設定の内容になります、
環境
- rustc 1.87.0
- cargo 1.87.0
- wasm-pack
- ubuntu 22 (windows WSL)
- node 20
書いたコード
- start
npm i
npm run build:wasm
npm run dev
- handler-wasm-2/src/lib.rs
- expressから、pathnameを渡す。
- GETの場合、get_handlerで、分岐処理
- 一致する場合、handler関数を実行
- 一致しない場合、404 扱い。
#[wasm_bindgen]
pub fn get_handler(pathname: &str) -> String {
println!("path={}", pathname);
let mut ret = "";
if pathname == "/foo" {
let r1 = get_foo_handler(pathname);
ret = &r1;
return ret.to_string();
}
let data = MyData {
data: "NOT FOUND".to_string(),
ret: 404,
};
serde_json::to_string(&data).unwrap()
}
pub fn get_foo_handler(pathname: &str) -> String {
println!("get_foo_test.path={}", pathname);
let data = MyData {
data: "get_foo_handler".to_string(),
ret: 200,
};
serde_json::to_string(&data).unwrap()
}

reqwest , Rust WASM 外部通信
- reqwest 外部通信のメモです。
- フロントから指定エンドポイント呼ばれる Rust関数です。
- http client 的な機能です。
- Google Spread のシートデータと連携します。
- database 使いません。
- Google Spread sheet 接続設定、こちら
環境
- reqwest
- rustc 1.87.0
- cargo 1.87.0
- wasm-pack
- ubuntu 22 (windows WSL)
- node 20
書いたコード
- start
npm i
npm run dev
.env
- GOOGLE_AUTH_API_KEY: API_KEY
- SPREADSHEET_ID_1: SPREAD sheet_id
GOOGLE_AUTH_API_KEY=""
SPREADSHEET_ID_1=""
- handler-wasm-3/Cargo.toml
[package]
name = "wasm_module"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib", "rlib"]
[dependencies]
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
serde = { version = "1.0.188", features = ["derive"] }
serde_json = "1.0.140"
serde-wasm-bindgen = "0.4"
reqwest = { version = "0.11", features = ["json"] }
js-sys = "0.3"
- handler-wasm-3/src/lib.rs
- Promise 使います。
- Google Spread APIの、apikey, sheetId は、node側から渡す。
if pathname == "/get_sheet_list" {
println!("get_sheet_list_handler.path= {}", pathname);
let urlparam3 = "/values/シート1!A1:C100?key=";
let urlparam4 = apikey;
let url = format!("{}{}{}{}", "https://sheets.googleapis.com/v4/spreadsheets/", sheet_id, urlparam3, urlparam4);
let resp = reqwest::get(url)
.await?
.text()
.await?;
let data = GenericResponse {
data: resp.to_string(),
ret: 200,
};
let out = serde_json::to_string(&data).unwrap();
return Ok(JsValue::from_str(&out))
}
let data = GenericResponse {
data: "NOT FOUND".to_string(),
ret: 404,
};
let out = serde_json::to_string(&data).unwrap();
Ok(JsValue::from_str(&out))

React + Rust WASM 構成
- React 追加して。バック側 WASM 通信等の試作です。
書いたコード
環境
- rustc 1.87.0
- cargo 1.87.0
- wasm-pack
- ubuntu 22 (windows WSL)
- node 20
- node/express
- start
npm i
npm run dev
- wasm-6/Cargo.toml
[package]
name = "wasm_module"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib", "rlib"]
[dependencies]
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
serde = { version = "1.0.188", features = ["derive"] }
serde_json = "1.0.140"
serde-wasm-bindgen = "0.4"
reqwest = { version = "0.11", features = ["json"] }
js-sys = "0.3"
- wasm-6/src-ts/client.tsx
- front 側
import ReactDOM from 'react-dom/client'
import React from 'react'
function App() {
return (
<div>
<h1 className="text-3xl font-bold">hello!</h1>
<hr />
<span>Hi , WASM + React</span>
</div>
);
}
ReactDOM.createRoot(document.getElementById('app')).render(
<App />
)
console.log('createRoot')
デプロイ , vercel
npm run build
- node_modules , target フォルダ以外は、 pushします。
- vercelから、インポートすると、デプロイできました。