You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复`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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:41:07