Использование Actix Identity с Juniper GraphQL

Я использую Actix Identity with Cookie Policy, чтобы store и собираетесь перейти с REST на GraphQL с помощью Juniper.

Было бы здорово создать конечную точку входа в GraphQL, используя actix identity.

Используя Juniper в Actix, я переместил запрос GraphQL в web::block

actix_web::web::block(|| move {
    let graphql_response = request.execute(&data, &context);

    Ok::<_, serde_json::error::Error>(serde_json::to_string(&graphql_response)?)
})

Затем передайте Identity как Juniper Context в Juniper для выполнения запроса login.

struct Context {
    identity: Identity,
    connection_pool: DatabaseConnectionPool
}

Единственная проблема в том, что я не могу передать Actix Identity в web::block из-за безопасности потоков.

std::rc::Rc<actix_web::request::HttpRequestInner>` cannot be sent between threads safely

Имея проблему с невозможностью передать identity потокобезопасности, я думаю о другом решении.

Заставив Juniper вернуть дополнительное поле для чтения внешнего потока web::block и выполнения, например:

struct Result {
  data: Juniper_output_or_something,
  action: special_action_field_which_return_on_every_query_to_outside_thread_safety
}

Обходной путь, о котором я мог подумать, - это каким-то образом передать Actix Identity в web::block или заставить Juniper возвращать дополнительное поле для выполнения за пределами web::block.

Любое предложение?


person SaltyAom    schedule 25.07.2020    source источник


Ответы (1)


Identity кодирует данные в строку, которую вы можете вытащить и вместо этого передать.

Измените свой Context на:

struct Context {
    identity: Option<String>,
    connection_pool: DatabaseConnectionPool,
}

И когда вы его построите, используйте identity.identity(), чтобы получить Option<String>.

person Peter Hall    schedule 25.07.2020