0

任何人都可以帮助我了解 FromRequest 特征。

据我了解,我们可以使用它与解析器共享数据。

我正在尝试注入 http 标头,以便在解析器中的某些操作之前对用户进行身份验证。

请参阅下面的代码。

看起来 from_request 甚至没有被调用。

我正在使用火箭 0.5.rc1

谢谢您的帮助

use juniper::{graphql_object, EmptySubscription, RootNode};
use mongodb::Client;
use mongodb::Database;


use rocket::{catch, catchers};
use rocket::{response::content, Rocket, State};

type Schema = RootNode<'static, Query, Mutations, EmptySubscription<AppContext>>;

use rocket::{
    http::Status,
    request::{FromRequest, Outcome},
    Request,
};

struct Mutations;
struct Query;

#[derive(Debug)]
pub struct AppContext {
    pub mongodb_pool: Database,
    pub user: String,
}

    impl juniper::Context for AppContext {}
    
    #[rocket::async_trait]
    impl<'r> FromRequest<'r> for AppContext {
        type Error = ();
    
        async fn from_request(request: &'r Request<'_>) -> Outcome<AppContext, Self::Error> {
            let client = Client::with_uri_str("mongodb://admin:admin@localhost:28017").await;
            let db = client.unwrap().database("override");
            Outcome::Success(AppContext { mongodb_pool: db, user: "from request".to_string() }, )
        }
    }
    
    #[graphql_object(context = AppContext)]
    impl Query {
        fn api_version(db: &AppContext) -> &str {
            println!("{:?}", db.user);
            "1.0"
        }
    }
    
    #[graphql_object(context = AppContext)]
    impl Mutations {
        fn api_version(db: &AppContext) -> String {
            "1.0".to_string()
        }
    }
    
    #[rocket::get("/")]
    fn graphiql() -> content::Html<String> {
        juniper_rocket::graphiql_source("/graphql", None)
    }
    
    #[rocket::get("/graphql?<request>")]
    async fn get_graphql_handler(
        context: &State<AppContext>,
        request: juniper_rocket::GraphQLRequest,
        schema: &State<Schema>,
    ) -> juniper_rocket::GraphQLResponse {
        request.execute(&*schema, &*context).await
    }
    
    #[rocket::post("/graphql", data = "<request>")]
    async fn post_graphql_handler(
        context: &State<AppContext>,
        request: juniper_rocket::GraphQLRequest,
        schema: &State<Schema>,
    ) -> juniper_rocket::GraphQLResponse {
        request.execute(&*schema, &*context).await
    }
    
    #[tokio::main]
    async fn main() {
        let client = Client::with_uri_str("mongodb://admin:admin@localhost:28017").await;
        let db = client.unwrap().database("app_db");
    
        Rocket::build()
            .manage(AppContext{ mongodb_pool: db, user: "from build".to_string() })
            .manage(Schema::new(
                Query,
                Mutations,
                EmptySubscription::<AppContext>::new(),
            ))
            .mount(
                "/",
                rocket::routes![graphiql, get_graphql_handler, post_graphql_handler],
            )
            .launch()
            .await
            .expect("server failed to launch");
    }
4

0 回答 0