Depósito (Depot)
Un depósito es usado para almacenar datos cuando se procesa la solicitud (request). Es muy útil para compartir datos entre los middlewares.
La instancia del depósito es creada cuando el servidor recibe la solicitud del cliente y será eliminada cuando la solicitud (request) hay sido procesada.
Por ejemplo, queremos establecer current_user
en set_user
, y entonces usar éste valor en los siguientes middlewares para manipular.
use salvo::prelude::*;
#[handler]
async fn set_user(depot: &mut Depot) {
depot.insert("current_user", "Elon Musk");
}
#[handler]
async fn hello(depot: &mut Depot) -> String {
// Notice: Don't use String here, because you inserted a &str.
let user = depot.get::<&str>("current_user").copied().unwrap();
format!("Hey {}, I love your money and girls!", user)
}
#[tokio::main]
async fn main() {
tracing_subscriber::fmt().init();
let router = Router::new().hoop(set_user).goal(hello);
let acceptor = TcpListener::new("127.0.0.1:5800").bind().await;
Server::new(acceptor).serve(router).await;
}
[package]
name = "example-use-depot"
version = "0.1.0"
edition = "2021"
publish = false
[dependencies]
salvo.workspace = true
tokio = { version = "1", features = ["macros"] }
tracing = "0.1"
tracing-subscriber = "0.3"
insert
y get
Establecer y recuperar datos vía Como se muestra arriba, key
y value
pueden ser insertadas dentro de Depot
vía insert
. Para valores de éste tipo, get
puede ser usado para recuperarlo directamente.
depot.insert("a", "b");
assert_eq!(depot.get::<&str>("a").copied().unwrap(), "b")
Returns None
if the key
does not exist, or if the key
exists, but the types do not match.
inject
y obtain
Establecer y recuperar datos vía A veces, hay casos donde no necesariamente requieres especificar key
, y también hay una única instancia del tipo. Para ésto puedes usar inject
para inyectar los datos, y obtain
para recuperar los datos. Ellos permiten insertar y recuperar datos sin utilizar key
.
depot.inject(Config::new());
depot.obtain::<Config>();