async-graphql/docs/zh-CN/src/define_complex_object.md

1.3 KiB
Raw Blame History

对象(Object)

和简单对象不同对象必须为所有的字段定义Resolver函数Resolver函数定义在impl块中。

一个Resolver函数必须是异步的它的第一个参数必须是&self,第二个参数是可选的Context,接下来是字段的参数。

Resolver函数用于计算字段的值你可以执行一个数据库查询并返回查询结果。函数的返回值是字段的类型,你也可以返回一个async_graphql::FieldResult类型,这样能够返回一个错误,这个错误信息将输出到查询结果中。

在查询数据库时你可能需要一个数据库连接池对象这个对象是个全局的你可以在创建Schema的时候SchemaBuilder::data函数设置Schema数据, 用Context::data函数设置Context数据。下面的value_from_db字段展示了如何从Context中获取一个数据库连接。

use async_graphql::*;

struct MyObject {
    value: i32,
}

#[Object]
impl MyObject {
    async fn value(&self) -> String {
        self.value.to_string()
    }

    async fn value_from_db(
        &self,
        ctx: &Context<'_>,
        #[arg(desc = "Id of object")] id: i64
    ) -> FieldResult<String> {
        let conn = ctx.data::<DbPool>()?.take();
        Ok(conn.query_something(id)?.name)
    }
}