Я использую 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
.
Любое предложение?