在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); } }
关键修改说明
异步方法的返回值处理:
handle_request改为async方法后,返回的是一个Future而非直接的Response,必须通过.await等待异步操作完成,才能拿到实际的响应对象。调整
service_fn的闭包逻辑:
原代码中直接将异步方法的返回值(Future)放入Ok中,导致类型不匹配。修改为async move闭包,在内部await异步方法结果后再包装成Ok,确保返回的Future输出类型符合service_fn的要求(Result<Response<Body>, Infallible>)。状态共享保持不变:
继续使用Arc克隆services_manager,保证每个请求处理实例都能安全共享全局状态,同时满足异步环境下的生命周期要求。
内容的提问来源于stack exchange,提问作者Martin Cowie
相关产品推荐
相关产品推荐

