使用async-graphql与warp搭建GraphQL服务器时遭遇async_graphql::Response未实现Reply trait的编译错误
解决
async_graphql::Response: Reply 编译错误的方法 这个错误很常见,本质是warp要求路由处理函数返回的类型必须实现Reply trait,而你直接返回了async_graphql::Response,它本身并没有实现这个trait。不过别担心,async-graphql-warp已经为我们提供了现成的解决方案,不需要自己手动实现转换逻辑。
修正步骤
你不需要自己写and_then来处理请求,直接使用async_graphql_warp::graphql_response相关的包装逻辑,就能自动完成从async_graphql::Response到warp兼容Reply的转换:
修正后的完整代码
use async_graphql::{Object, Schema, EmptyMutation, EmptySubscription, Context}; use std::convert::Infallible; use warp::{Filter}; #[tokio::main] async fn main() { let schema = Schema::build(Query, EmptyMutation, EmptySubscription).finish(); // 使用async-graphql-warp提供的GraphQLResponse包装器处理响应转换 let graphql_api = async_graphql_warp::graphql(schema) .and_then(|(schema, request)| async move { let response = schema.execute(request).await; Ok::<_, Infallible>(async_graphql_warp::GraphQLResponse::from(response)) }); let routes = graphql_api; warp::serve(routes).bind(([0,0,0,0], 3000)).await; } pub struct Book { id: String, name: String, author: String, } #[Object] impl Book { async fn id(&self) -> &str { &self.id } async fn name(&self) -> &str { &self.name } async fn author(&self) -> &str { &self.author } } struct Query; #[Object] impl Query { async fn books(&self, _ctx: &Context<'_>) -> Vec<Book> { vec![new_book("id1", "Penturian", "Gibsons"), new_book("id2", "Dekatos", "Gibsons")] } } fn new_book(id: &str, name: &str, author: &str) -> Book { Book { id: id.to_string(), name: name.to_string(), author: author.to_string()} }
为什么原来的代码会报错?
warp的serve函数要求路由的输出类型必须实现Reply——这个 trait 定义了如何把结果转换成标准HTTP响应。你直接返回的async_graphql::Response只是GraphQL层面的响应对象,并没有和warp的HTTP响应系统绑定。而async_graphql_warp::GraphQLResponse是官方提供的包装类型,它已经为我们实现了Reply trait,能自动把GraphQL响应序列化成JSON并设置正确的HTTP头。
如果你好奇手动转换的方式(不推荐,没必要重复造轮子),可以参考下面的示例:
// 手动转换示例(仅作参考,优先用官方包装器) .and_then(|(schema, request)| async move { let response = schema.execute(request).await; let json = serde_json::to_string(&response).unwrap(); Ok::<_, Infallible>(warp::reply::json(&json)) })
内容的提问来源于stack exchange,提问作者DungeonTiger
相关产品推荐
相关产品推荐

