Rust プロセスを、 node/express から起動してDB登録 #Rust #node


■ 概要:

前のRustの関連となり。
node/express から、Rustプロセスを呼出し
jsonファイルから , sqlite3に登録する例となります。

・前の、Rust sqlite3 と同様で、起動時の処理を修正しています。

■ 環境

Rust
rustc 1.46.0
cargo 1.46.0
node 14.11
express
sqlite3
ubuntu 18.04

■ Cargo.toml

[dependencies]
rusqlite = "0.24.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
chrono = "0.4.15"

■ Rust, main.rs

https://gist.github.com/kuc-arc-f/b172fb1f8f043e66773094146cd50bc8

pub fn exec_main(json_fname: String, dbfname: String){
   let text = Utc::now().format("%Y-%m-%d %H:%M:%S.%f").to_string();
   println!("text_1={}", text);
   let dt1: NaiveDateTime = NaiveDateTime::parse_from_str( &text, "%Y-%m-%d %H:%M:%S.%f").unwrap();

//    let json_fname = "/home/naka/work/node/express/app7/public/tasks.json";
   let json = get_content( json_fname );
//    println!("main={}", json);
   let deserialized: Vec<TaskItem> = serde_json::from_str(&json).unwrap();
   let dbfname_str = String::from(dbfname);
//    let dbfname_str = String::from("/home/naka/work/node/express/app7/public/test.db");
   exec_sql_array(dbfname_str , deserialized);

   let text_2 = Utc::now().format("%Y-%m-%d %H:%M:%S.%f").to_string();
   let dt2: NaiveDateTime = NaiveDateTime::parse_from_str( &text_2, "%Y-%m-%d %H:%M:%S.%f" ).unwrap();
   let duration: Duration = dt2 - dt1;
   println!("text_2={}", text_2 );
   println!("secs: {}", duration.num_seconds());
   println!("milliseconds: {}", duration.num_milliseconds());    
}
//
fn main(){
   println!("#-start-main");
   let args: Vec<String> = env::args().collect();
   let arg1 = &args[1];
   let arg2 = &args[2];
   println!("{:?}", args);
   println!("{}", arg1 );
   exec_main( arg1.to_string() , arg2.to_string() );

}

・Rust 起動時に、jsonファイル、dbファイルのパスを受け取ります。

■ express, Rust起動

https://gist.github.com/kuc-arc-f/dd8dfe8b6209dbfb3928907baf9f0aaa

・jsonファイル、dbファイルのパスを渡します
・spawnで、 Rustパスを指定

const { spawn } = require('child_process');

//
router.get('/', function(req, res, next) {
   res.send('respond with a resource-1234');
});

//
router.get('/test1', function(req, res, next) {
//    console.log("test_proc");
   var json_fname = "/hoge/public/tasks.json";
   var dbfname = "/hoge/public/test.db";
   const child = spawn('./public/sqlite-test', [json_fname , dbfname ]);

   child.stdout.on('data', (data) => {
     console.log('stdout data:', data.toString('utf8'));
   });
   child.stderr.on('data', (data) => {
     console.error('stderr data:', data.toString('utf8'));
   });
   child.on('close', (code) => {
     console.log("on close:", code);
   });
   res.send("1");    
});


■ テスト、登録確認

curl で、起動する例です。db追加の確認ができました

$ curl http://localhost:3000/wasm_proc/test1
$ sqlite3 public/test.db
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> select count(*)  from tasks;
2100
sqlite>

■ まとめ

プロセス起動する方法になりますが。
URL指定で、Rust処理を起動でき。
ファイル読み書き、DB登録等が可能になり。便利かと思いました


ここから先は

0字

Rust WebAssembly 開発の事例、ノウハウに関する記事を集めました。第2回 ■ 免責事項 / 注記 , 内容について動作確…

この記事が気に入ったらサポートをしてみませんか?