当前位置: 首页 > article >正文

auxm 注册多个router参数时报错

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函数参数顺序


http://www.kler.cn/a/379253.html

相关文章:

  • 气象大模型学习笔记
  • C#的Event事件示例小白级剖析
  • 【Centos】在 CentOS 9 上使用 Apache 搭建 PHP 8 教程
  • 《Java 实现希尔排序:原理剖析与代码详解》
  • spark-yarn模式的配置
  • 不基于Gin手撸一个RPC服务
  • Python数据分析NumPy和pandas(二十、数据清洗和预处理之二:数据转换)
  • 开源模型应用落地-glm模型小试-glm-4-9b-chat-快速体验(一)
  • SpringBoot核心知识点
  • 初识动态规划(由浅入深)
  • Spring Boot 应用开发指南
  • .Net C# 基于EFCore的DBFirst和CodeFirst
  • Docker基本概念汇总(更全面了解Docker)
  • 15. 文件操作
  • Netty 常见组件介绍
  • 鸿蒙生态认识
  • Marvelous Designer导出纹理没有合并
  • leetcode-有效的字母异位词
  • PHP如何规避从URL的语义进行攻击
  • CSP 2024 入门级第二轮 CSP-J 2024 复赛 第二题 地图探险
  • 李彦宏《应用来了》主题演讲海报官宣,百度世界或带来多个新发布
  • 网络编程及回显服务器
  • flutter 专题四 Flutter渲染流程
  • [云] 大数据分析栈(Big Data Analytics Stack)+ Apache Hadoop分布式文件系统(HDFS)+Apache Spark
  • CSS综合练习(学校官网静态网页)
  • java HashMap