pub fn from_fn<F, T>(f: F) -> FromFnLayer<F, (), T>
Expand description
Create a middleware from an async function.
from_fn
requires the function given to
- Be an
async fn
. - Take one or more extractors as the first arguments.
- Take
Next
as the final argument. - Return something that implements
IntoResponse
.
Note that this function doesn’t support extracting State
. For that, use from_fn_with_state
.
§Example
use axum::{
Router,
http,
routing::get,
response::Response,
middleware::{self, Next},
extract::Request,
};
async fn my_middleware(
request: Request,
next: Next,
) -> Response {
// do something with `request`...
let response = next.run(request).await;
// do something with `response`...
response
}
let app = Router::new()
.route("/", get(|| async { /* ... */ }))
.layer(middleware::from_fn(my_middleware));
§Running extractors
use axum::{
Router,
extract::Request,
http::{StatusCode, HeaderMap},
middleware::{self, Next},
response::Response,
routing::get,
};
async fn auth(
// run the `HeaderMap` extractor
headers: HeaderMap,
// you can also add more extractors here but the last
// extractor must implement `FromRequest` which
// `Request` does
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
match get_token(&headers) {
Some(token) if token_is_valid(token) => {
let response = next.run(request).await;
Ok(response)
}
_ => {
Err(StatusCode::UNAUTHORIZED)
}
}
}
fn get_token(headers: &HeaderMap) -> Option<&str> {
// ...
}
fn token_is_valid(token: &str) -> bool {
// ...
}
let app = Router::new()
.route("/", get(|| async { /* ... */ }))
.route_layer(middleware::from_fn(auth));