Rust调用async函数报expected opaque type, found enum Result错误如何解决
报错原因
async函数调用后不会直接返回你定义的返回值,而是返回一个Future类型的对象,必须通过.await等待它执行完成,才能拿到最终的Result结果- 要在函数内部使用
.await语法,当前函数必须也声明为async - 原代码中日志宏的字符串拼接写法不符合Rust规范,Rust格式化宏不支持
+运算符拼接变量 - 你当前定义的
get_user_info返回的是Result<(), Error>,Ok分支没有返回任何有效用户数据,即使调用成功也拿不到用户信息
代码修改
第一步:修改get_user_info返回值,返回查询到的用户数据
use std::collections::HashMap; pub async fn get_user_info(input_user_id:i64) -> Result<HashMap<String, String>, Box<dyn std::error::Error>> { let url = "http://dolphin-post-service.reddwarf-pro.svc.cluster.local:11014/post/user/"; // 无需手动转'static字符串,直接拼接即可 let resp = reqwest::get(format!("{}{}", url, input_user_id)) .await? .json::<HashMap<String, String>>() .await?; println!("{:#?}", resp); // 返回查询到的用户数据 Ok(resp) }
第二步:修改接口handler函数,支持async和await
#[get("/v1/user")] // 给函数加上async关键字 pub async fn user_info(){ // 调用async函数后加.await,拿到执行后的Result结果 match get_user_info(16).await { Ok(user_info) => { // 格式化宏用占位符传参,不要用+拼接 info!("get user info success: {:?}", user_info); }, Err(e) => { info!("error: {}", e); }, } }
额外说明
如果不需要返回用户数据,只是要打印日志,也可以不改get_user_info的返回值,只修改接口handler的async声明和加.await即可。你原代码里用到的string_to_static_str如果没有特殊需求建议删掉,强行转静态字符串容易引发内存泄漏。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

