Axum中返回StatusCode的async函数为何未实现Handler trait
报错根本原因
你在注册路由时错误地给handler函数加了调用括号,把函数执行的返回值传给了路由方法,而非函数本身。
看你出错的代码行:
Router::new().route("/webhook", post(webhook_handler()))
这里webhook_handler()带了括号,意味着你在构建路由的当下就执行了这个async函数,把它返回的impl Future<Output = StatusCode>实例传给了post()方法。
而Axum的post/get等路由方法,要求传入的参数是实现了Handler trait的处理函数/闭包本身:
- 不带括号的
webhook_handler是async函数项类型,本身已经实现了对应版本的Handlertrait,符合参数要求,这也是官方示例的正确写法 - 带括号调用后得到的Future对象,并没有实现
Handlertrait,因此编译器抛出trait约束不满足的错误。
修复方式
去掉handler名后面的括号,直接传入函数本身即可:
pub fn create_routes() -> Router { Router::new().route("/webhook", post(webhook_handler)) }
内容的提问来源于stack exchange,提问作者The Mungler
相关产品推荐
相关产品推荐

