gpt4 book ai didi

mongodb - Rust Actix Web 是否支持 MongoDB?

转载 作者:行者123 更新时间:2023-11-29 08:26:08 26 4
gpt4 key购买 nike

我有一个新的 Rust 编程后端学习。从 Web 框架开始。因为我想将 Rust 后端与 MongoDB 一起使用,所以我有 Nickel 的示例代码。不管怎样,我也看到有 Actix Web Framework。

Actix Web 是否像 Nickel 一样支持 MongoDB?

以下示例为 Nickel 提供了 MongoDB。

//main.rs — Nickel
#[macro_use] 
extern crate nickel;
extern crate rustc_serialize;

#[macro_use(bson, doc)]
extern crate bson;
extern crate mongodb;

// Nickel
use nickel::{Nickel, JsonBody, HttpRouter, MediaType};
use nickel::status::StatusCode::{self};

// MongoDB
use mongodb::{Bson, bson, doc};
use mongodb::{Client, ThreadedClient};
use mongodb::db::ThreadedDatabase;
use mongodb::error::Result as MongoResult;

// bson
use bson::{Bson, Document};
use bson::oid::ObjectId;

// serde
use serde::{Serialize, Deserialize};

use std::fs::File;
use std::io::Read;
#[derive(Debug, Serialize, Deserialize)]
struct User {
    firstname: String,
    lastname: String,
    email: String
}

fn main(){
    let mut server = Nickel::new();
    let mut router = Nickel::router();

    router.get("/users", middleware! { |_req, _res|
        let client = Client::connect("localhost", 27017)
            .ok().expect("Error establishing connection.");

        let coll = client.db("rusty").collection("users");

        let mut cursor = coll.find(None, None).unwrap();
        let mut data_result = "{\"data\":[".to_owned();

        for (i, result) in cursor.enumerate() {

            if let Ok(item) = result {
                if let Some(&Bson::String(ref firstname)) = item.get("firstname") {
                    let string_data = if i == 0 {
                        format!("{},", firstname)
                    } else {
                        format!("{},", firstname)
                    };
                data_result.push_str(&string_data);
            }
        }
    }
    data_result.push_str("]}");

    format!("{}", data_result)

    });

    router.post("/users/new", middleware! { |_req, _res|
        let user = _req.json_as::<User>().unwrap();
        let firstname = user.firstname.to_string();
        let lastname = user.lastname.to_string();
        let email = user.email.to_string();

        let client = Client::connect("localhost", 27017)
            .ok().expect("Error establishing connection.");

        let coll = client.db("rusty").collection("users");

        match coll.insert_one(doc! {
            "firstname" => firstname,
            "lastname" => lastname,
            "email" => email
        }, None) {
            Ok(_) => (StatusCode::Ok, "Item saved!"),
            Err(e) => return _res.send(format!("{}", e))
        }
    });
    router.delete("/users/:id", middleware! { |_req, _res|
        let client = Client::connect("localhost", 27017)
            .ok().expect("Failed to initialize standalone client.");

        let coll = client.db("rusty").collection("users");

        let object_id = _req.param("id").unwrap();
        let id = match ObjectId::with_string(object_id) {
            Ok(oid) => oid,
            Err(e) => return _res.send(format!("{}", e))
        };
        match coll.delete_one(doc! {"_id" => id}, None) {
            Ok(_) => (StatusCode::Ok, "Item deleted!"),
            Err(e) => return _res.send(format!("{}", e))
        }
    });
    server.utilize(router);
    server.listen("0.0.0.0:3000").unwrap();
}

最佳答案

简短的版本是肯定的,它会,因为你的库返回 Result,这基本上独立于你决定使用的任何框架。

长答案是肯定的,但要小心。作为官方的 mongoDB 客户端(您正在使用的客户端)和几乎所有替代方案都具有完全阻塞的操作(从您调用 find() 到获得 Result,主线程被阻塞),这意味着您的整个事件循环可能会在该时间间隔内阻塞。

社区似乎没有努力改进底层的 mongo C 库,或者将所有操作转移到另一个线程并提供进出该线程的数据访问,所以很遗憾,您现在没有选择。

关于mongodb - Rust Actix Web 是否支持 MongoDB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57904457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com