您的位置:首页 > 新闻 > 资讯 > 土巴兔装修_四川成都房产网_百度seo报价_福建百度seo排名点击软件

土巴兔装修_四川成都房产网_百度seo报价_福建百度seo排名点击软件

2025/5/10 20:50:25 来源:https://blog.csdn.net/jioulongzi/article/details/143464050  浏览:    关键词:土巴兔装修_四川成都房产网_百度seo报价_福建百度seo排名点击软件
土巴兔装修_四川成都房产网_百度seo报价_福建百度seo排名点击软件
auxm在controller函数定义多个接收参数时报错

最近手上有个活,打算用点新东西开发。 刚好最近学习了rust开发。于是心里想:就他了。

因为是web项目,网上一搜索,rust web框架auxm还不错。 打开官网就开始搭建demo。 最开始肯定是先写简单的demo函数,get/post路径传参,json传参,form表单传参等等。

以上都很简单,有手就行。 接着就整合数据库,使用了sqlx

根据auxm官网资料, auxm整合sqlx需要先初始化实例,然后注册到路由上下文中,这样就可以动态注入了。

官网的代码一般给的示例都是单独的,比如接收path参数示例,router方法就一个接收path参数。接收json方法,也只定义了一个接收json的参数。我去看了下router注册函数,官方解释是可以接收一个或多个extract。

那就很简单,把所有需要的申明出来就行了

所以大概代码长下面这样(注意addusers函数):

pub async  fn init(dburi:&String)  -> Router {
// 初始化数据库连接let dbpool:Pool<MySql> = MySqlPoolOptions::new().max_connections(5).acquire_timeout(Duration::from_secs(3)).connect(dburi).await.expect("can't connect to database");let  route = Router::new().route("/", get(|| async { "Hello, World!" })).route("/addusers/:id",post(controller::create_user),)// 注入到router中.with_state(dbpool);route
}pub async fn create_user( Path(id): Path<u32>,Json(payload): Json<CreateUserPayload>,State(pool): State<Pool<MySql>>) -> Json<BaseRes>{Json(BaseRes { code: 0, msg: payload.name })
}

写完代码,立马我被教育了:vscode马上提示错误,router注册addusers函数那里代码报错:

the trait bound `fn(axum::extract::Path<u32>, axum::Json<CreateUserPayload>, axum::extract::State<Pool<MySql>>) -> impl Future<Output = axum::Json<BaseRes>> {create_user}: Handler<_, _>` is not satisfied
the full name for the type has been written to 'D:\workspace\rust\rust-web-starter\target\debug\deps\rust_web_starter-37beb1a7e3065925.long-type-10239921290377372162.txt'
consider using `--verbose` to print the full type name to the console
Consider using `#[axum::debug_handler]` to improve the error message
the following other types implement trait `Handler<T, S>`:`MethodRouter<S>` implements `Handler<(), S>``axum::handler::Layered<L, H, T, S>` implements `Handler<T, S>`rustcClick for full compiler diagnostic

我不过就是整合了下,怎么就报错了嘞?

不死心又在官网上看了一圈,依然没找到什么。心里也是懵了,这什么情况?

最后不死心,又找了几个小时,终于官网找到了答案:就是router定义参数,必须严格按照顺序,先解析请求头,再解析上下文请求体,最后解析请求体。所以以上代码定义应该是:

pub async fn create_user( Path(id): Path<u32>,State(pool): State<Pool<MySql>>,Json(payload): Json<CreateUserPayload>,) -> Json<BaseRes>{Json(BaseRes { code: 0, msg: payload.name })
}

上面代码就不报错了,唉。活见久。

点击查看官方文档-router函数参数顺序

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com