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 zero or more FromRequestPartsextractors.
- Take exactly one FromRequestextractor as the second to last argument.
- Take Nextas the last 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));