在请求守卫中访问 Rocket 0.4 数据库连接池
Accessing the Rocket 0.4 database connection pool in a request guard
我正在使用 Rocket 创建一个带有身份验证的 Web 应用程序。为此,我创建了一个实现 FromRequest
的 User
结构。它需要授权 header,其中包含 JSON Web 令牌。我反序列化此令牌以获取有效负载,然后从数据库中查询用户。这意味着 FromRequest
实现需要 diesel::PgConnection
。在 Rocket 0.3 中,这意味着调用 PgConnection::establish
,但在 Rocket 0.4 中,我们可以访问连接池。通常我会按如下方式访问此连接池:
fn get_data(conn: db::MyDatabasePool) -> MyModel {
MyModel::get(&conn)
}
但是,在 FromRequest
的 impl 块中,我不能只将 conn
参数添加到 from_request
函数的参数列表中。我如何在请求守卫之外访问我的连接池?
火箭 guide for database state 说:
Whenever a connection to the database is needed, use your [database pool] type as a request guard
由于可以通过 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))
}
}
我正在使用 Rocket 创建一个带有身份验证的 Web 应用程序。为此,我创建了一个实现 FromRequest
的 User
结构。它需要授权 header,其中包含 JSON Web 令牌。我反序列化此令牌以获取有效负载,然后从数据库中查询用户。这意味着 FromRequest
实现需要 diesel::PgConnection
。在 Rocket 0.3 中,这意味着调用 PgConnection::establish
,但在 Rocket 0.4 中,我们可以访问连接池。通常我会按如下方式访问此连接池:
fn get_data(conn: db::MyDatabasePool) -> MyModel {
MyModel::get(&conn)
}
但是,在 FromRequest
的 impl 块中,我不能只将 conn
参数添加到 from_request
函数的参数列表中。我如何在请求守卫之外访问我的连接池?
火箭 guide for database state 说:
Whenever a connection to the database is needed, use your [database pool] type as a request guard
由于可以通过 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))
}
}