You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Hyper请求处理器中调用异步方法遇编译问题求助

解决Hyper中async请求处理方法的类型不匹配问题

修改后的完整代码

use std::convert::Infallible;
use std::sync::Arc;
hyper::{Body, Request, Response, Server};
hyper::service::{make_service_fn, service_fn};

struct ContrivedServicesManager {
    some_state: Vec<String>
}

impl ContrivedServicesManager {
    pub async fn handle_request(&self, _req: Request<Body>) -> Response<Body> {
        hyper::Response::new(Body::from(self.some_state.join(", ")))
    }

    fn new(args: Vec<String>) -> Self {
        Self {
            some_state: args
        }
    }
}

#[tokio::main]
async fn main() {
    // Grab all the command line args following argv[0]
    let args: Vec<String> = std::env::args()
        .enumerate()
        .filter(|&(i,_)| i > 0)
        .map(|(_, e)| e)
        .collect();

    // The inner layer of request handling machinery
    let services_manager = Arc::new(ContrivedServicesManager::new(args));

    // Build the outer layer of request handling machinery
    let service_maker = make_service_fn(move |_| {
        let services_manager = services_manager.clone();

        async move {
            Ok::<_, Infallible>(service_fn(move |req| async move {
                let response = services_manager.handle_request(req).await;
                Ok::<_, Infallible>(response)
            }))
        }
    });

    // Configure & start the web server
    let addr = ([127, 0, 0, 1], 3000).into();
    let server = Server::bind(&addr).serve(service_maker);
    println!("Listening on http://{}", addr);
    if let Err(e) = server.await {
        eprintln!("server error: {}", e);
    }
}

关键修改说明

  1. 异步方法的返回值处理:
    handle_request改为async方法后,返回的是一个Future而非直接的Response,必须通过.await等待异步操作完成,才能拿到实际的响应对象。

  2. 调整service_fn的闭包逻辑:
    原代码中直接将异步方法的返回值(Future)放入Ok中,导致类型不匹配。修改为async move闭包,在内部await异步方法结果后再包装成Ok,确保返回的Future输出类型符合service_fn的要求(Result<Response<Body>, Infallible>)。

  3. 状态共享保持不变:
    继续使用Arc克隆services_manager,保证每个请求处理实例都能安全共享全局状态,同时满足异步环境下的生命周期要求。

内容的提问来源于stack exchange,提问作者Martin Cowie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:35:33