如何修复`time::OffsetDateTime`未实现`OutputType` trait的错误?
解决async-graphql中OffsetDateTime未实现OutputType的问题
问题原因
async-graphql默认未为time::OffsetDateTime实现OutputType trait,而SimpleObject派生宏要求所有字段类型必须实现该trait,因此触发编译报错。
解决方案
方案1:启用async-graphql的time特性(推荐)
async-graphql内置了对time库类型的支持,只需在依赖中开启time特性,就能自动完成OutputType的实现:
修改Cargo.toml中的async-graphql依赖配置:
async-graphql = { version = "你的实际版本号", features = ["time"] }
修改后无需改动原有代码,Player结构体可直接正常编译使用。
方案2:手动实现OutputType
如果不想启用内置特性,或需要自定义日期时间的序列化逻辑,可以手动为OffsetDateTime实现OutputType:
use async_graphql::{SimpleObject, OutputType, Value, Registry}; use time::{OffsetDateTime, format_description::well_known::Iso8601}; impl OutputType for OffsetDateTime { fn type_name() -> &'static str { "DateTime" } fn create_type_info(registry: &mut Registry) -> async_graphql::FieldType { registry.create_scalar_type::<Self>() } fn resolve(&self) -> async_graphql::Result<Value> { // 将OffsetDateTime序列化为ISO8601格式字符串 let datetime_str = self.format(&Iso8601::DEFAULT)?; Ok(Value::String(datetime_str)) } } #[derive(SimpleObject)] struct Player { id: String, created_at: OffsetDateTime, email: String, }
该实现将OffsetDateTime转换为标准ISO8601格式的字符串作为GraphQL输出值,符合常见的日期时间传输规范。
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

