Mai*_*cmi 0 mongodb rust actix-web
我有一个新的 Rust 编程后端学习。\n从 Web 框架开始。\n因为我想将 Rust 后端与 MongoDB 一起使用,所以我有 Nickel 的示例代码。\n无论如何,我还看到有 Actix Web 框架。
\n\nActix Web 是否像 Nickel 一样支持 MongoDB?
\n\n以下示例通过 MongoDB 提供 Nickel。
\n\n//main.rs \xe2\x80\x94 Nickel\n#[macro_use]\xc2\xa0\nextern\xc2\xa0crate\xc2\xa0nickel;\nextern\xc2\xa0crate\xc2\xa0rustc_serialize;\n\n#[macro_use(bson,\xc2\xa0doc)]\nextern\xc2\xa0crate\xc2\xa0bson;\nextern\xc2\xa0crate\xc2\xa0mongodb;\n\n//\xc2\xa0Nickel\nuse\xc2\xa0nickel::{Nickel,\xc2\xa0JsonBody,\xc2\xa0HttpRouter,\xc2\xa0MediaType};\nuse\xc2\xa0nickel::status::StatusCode::{self};\n\n//\xc2\xa0MongoDB\nuse\xc2\xa0mongodb::{Bson,\xc2\xa0bson,\xc2\xa0doc};\nuse\xc2\xa0mongodb::{Client,\xc2\xa0ThreadedClient};\nuse\xc2\xa0mongodb::db::ThreadedDatabase;\nuse\xc2\xa0mongodb::error::Result\xc2\xa0as\xc2\xa0MongoResult;\n\n//\xc2\xa0bson\nuse\xc2\xa0bson::{Bson,\xc2\xa0Document};\nuse\xc2\xa0bson::oid::ObjectId;\n\n//\xc2\xa0serde\nuse\xc2\xa0serde::{Serialize,\xc2\xa0Deserialize};\n\nuse\xc2\xa0std::fs::File;\nuse\xc2\xa0std::io::Read;\n#[derive(Debug,\xc2\xa0Serialize,\xc2\xa0Deserialize)]\nstruct\xc2\xa0User\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0firstname:\xc2\xa0String,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0lastname:\xc2\xa0String,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0email:\xc2\xa0String\n}\n\nfn\xc2\xa0main(){\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0mut\xc2\xa0server\xc2\xa0=\xc2\xa0Nickel::new();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0mut\xc2\xa0router\xc2\xa0=\xc2\xa0Nickel::router();\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0router.get("/users",\xc2\xa0middleware!\xc2\xa0{\xc2\xa0|_req,\xc2\xa0_res|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0client\xc2\xa0=\xc2\xa0Client::connect("localhost",\xc2\xa027017)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.ok().expect("Error\xc2\xa0establishing\xc2\xa0connection.");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0coll\xc2\xa0=\xc2\xa0client.db("rusty").collection("users");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0mut\xc2\xa0cursor\xc2\xa0=\xc2\xa0coll.find(None,\xc2\xa0None).unwrap();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0mut\xc2\xa0data_result\xc2\xa0=\xc2\xa0"{\\"data\\":[".to_owned();\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0for\xc2\xa0(i,\xc2\xa0result)\xc2\xa0in\xc2\xa0cursor.enumerate()\xc2\xa0{\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if\xc2\xa0let\xc2\xa0Ok(item)\xc2\xa0=\xc2\xa0result\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if\xc2\xa0let\xc2\xa0Some(&Bson::String(ref\xc2\xa0firstname))\xc2\xa0=\xc2\xa0item.get("firstname")\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0string_data\xc2\xa0=\xc2\xa0if\xc2\xa0i\xc2\xa0==\xc2\xa00\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0format!("{},",\xc2\xa0firstname)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\xc2\xa0else\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0format!("{},",\xc2\xa0firstname)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0};\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0data_result.push_str(&string_data);\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0data_result.push_str("]}");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0format!("{}",\xc2\xa0data_result)\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0});\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0router.post("/users/new",\xc2\xa0middleware!\xc2\xa0{\xc2\xa0|_req,\xc2\xa0_res|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0user\xc2\xa0=\xc2\xa0_req.json_as::<User>().unwrap();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0firstname\xc2\xa0=\xc2\xa0user.firstname.to_string();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0lastname\xc2\xa0=\xc2\xa0user.lastname.to_string();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0email\xc2\xa0=\xc2\xa0user.email.to_string();\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0client\xc2\xa0=\xc2\xa0Client::connect("localhost",\xc2\xa027017)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.ok().expect("Error\xc2\xa0establishing\xc2\xa0connection.");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0coll\xc2\xa0=\xc2\xa0client.db("rusty").collection("users");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0match\xc2\xa0coll.insert_one(doc!\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0"firstname"\xc2\xa0=>\xc2\xa0firstname,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0"lastname"\xc2\xa0=>\xc2\xa0lastname,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0"email"\xc2\xa0=>\xc2\xa0email\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0},\xc2\xa0None)\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Ok(_)\xc2\xa0=>\xc2\xa0(StatusCode::Ok,\xc2\xa0"Item\xc2\xa0saved!"),\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Err(e)\xc2\xa0=>\xc2\xa0return\xc2\xa0_res.send(format!("{}",\xc2\xa0e))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0});\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0router.delete("/users/:id",\xc2\xa0middleware!\xc2\xa0{\xc2\xa0|_req,\xc2\xa0_res|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0client\xc2\xa0=\xc2\xa0Client::connect("localhost",\xc2\xa027017)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.ok().expect("Failed\xc2\xa0to\xc2\xa0initialize\xc2\xa0standalone\xc2\xa0client.");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0coll\xc2\xa0=\xc2\xa0client.db("rusty").collection("users");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0object_id\xc2\xa0=\xc2\xa0_req.param("id").unwrap();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0id\xc2\xa0=\xc2\xa0match\xc2\xa0ObjectId::with_string(object_id)\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Ok(oid)\xc2\xa0=>\xc2\xa0oid,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Err(e)\xc2\xa0=>\xc2\xa0return\xc2\xa0_res.send(format!("{}",\xc2\xa0e))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0};\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0match\xc2\xa0coll.delete_one(doc!\xc2\xa0{"_id"\xc2\xa0=>\xc2\xa0id},\xc2\xa0None)\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Ok(_)\xc2\xa0=>\xc2\xa0(StatusCode::Ok,\xc2\xa0"Item\xc2\xa0deleted!"),\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Err(e)\xc2\xa0=>\xc2\xa0return\xc2\xa0_res.send(format!("{}",\xc2\xa0e))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0});\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0server.utilize(router);\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0server.listen("0.0.0.0:3000").unwrap();\n}\nRun Code Online (Sandbox Code Playgroud)\n
简而言之,是的,它会,因为您的库返回Results,并且这基本上独立于您决定使用的任何框架。
长的答案是肯定的,但需要谨慎。由于官方 mongoDB 客户端(您正在使用的客户端)和几乎所有替代方案都具有完全阻塞操作(从您调用的时间find()到您获取 的时间Result,主线程被阻塞),这意味着您的整个事件循环在此间隔期间可能会阻塞。
社区似乎没有努力改进底层 mongo C 库,或者将所有操作转移到另一个线程并提供与该线程之间的数据访问,因此遗憾的是,您现在缺乏选择。