Доступ к пулу соединений с базой данных Rocket 0.4 в защите запросов - PullRequest
0 голосов
/ 16 марта 2019

Я создаю веб-приложение с аутентификацией с помощью Rocket. Для этого я создал User структуру, которая реализует FromRequest. Он принимает заголовок авторизации, который содержит JSON Web Token. Я десериализирую этот токен для получения полезной нагрузки, а затем запрашиваю пользователя из базы данных. Это означает, что для реализации FromRequest требуется diesel::PgConnection. В Rocket 0.3 это означало вызов PgConnection::establish, но с Rocket 0.4 у нас есть доступ к пулу соединений. Обычно я получаю доступ к этому пулу соединений следующим образом:

fn get_data(conn: db::MyDatabasePool) -> MyModel {
    MyModel::get(&conn)
}

Однако внутри блока impl для FromRequest я не могу просто добавить аргумент conn в список аргументов функции from_request. Как мне получить доступ к пулу подключений за пределами защиты запросов?

1 Ответ

2 голосов
/ 17 марта 2019

Руководство Rocket для состояния базы данных гласит:

Когда необходимо подключение к базе данных, используйте тип [пул базы данных] в качестве защиты запроса

Поскольку пул базы данных может быть создан с помощью FromRequest, а вы реализуете FromRequest, используйте существующую реализацию с помощью DbPool::from_request(request):

use rocket::{
    request::{self, FromRequest, Request},
    Outcome,
};

// =====
// This is a dummy implementation of a pool
// Refer to the Rocket guides for the correct way to do this
struct DbPool;

impl<'a, 'r> FromRequest<'a, 'r> for DbPool {
    type Error = &'static str;

    fn from_request(_: &'a Request<'r>) -> request::Outcome<Self, Self::Error> {
        Outcome::Success(Self)
    }
}
// =====

struct MyDbType;

impl MyDbType {
    fn from_db(_: &DbPool) -> Self {
        Self
    }
}

impl<'a, 'r> FromRequest<'a, 'r> for MyDbType {
    type Error = &'static str;

    fn from_request(request: &'a Request<'r>) -> request::Outcome<Self, Self::Error> {
        let pool = DbPool::from_request(request);
        pool.map(|pool| MyDbType::from_db(&pool))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...