TypeORM Apollo 嵌套查询解析器

Posted

技术标签:

【中文标题】TypeORM Apollo 嵌套查询解析器【英文标题】:TypeORM Apollo nested query resolver 【发布时间】:2019-09-12 03:37:02 【问题描述】:

我有一个架构(定义了适当的数据库表和实体类),例如

type User 
    id: Int!
    phoneNumber: String!


type Event 
    id: Int!
    host: User
  

我正在尝试使用 Apollo 来编写类似

的查询
Query
  event(id:1)
    host
      firstName
    
  

但我不知道如何让 Apollo 库将主机字段中的用户类型解析为存储在事件对象上的 hostId。

我修改了事件以返回 hostId 字段,它工作得很好,但 Graphql 不会将 id 解析为适当的用户类型。我错过了什么?

编辑:缺少解析器代码

event: async (parent: any, args:  id: number ) => 
      const eventRepository = getConnection().getRepository(Event);
      const event = await eventRepository.findOne(args.id);
      return event;
    ,

我设法通过使用findOne(args.id, relations: ['host']) 获得了一个工作版本,但我不喜欢这样,因为它似乎适合委派给 graphql 来处理。

【问题讨论】:

请附上相关的解析器代码。 【参考方案1】:

你的解析器应该是这样的

const resolver = 

Query: 
    event: async (_: any, args: any) => 
      return await event.findOne(args.id);
    
  ,
  event: 
    host: async (parent: any, args: any, context: any) => 
      return await user.find( id: parent.id );
    
  
;

【讨论】:

这不是违背了使用graphql的目的吗?如果我必须手动编写所有这些嵌套的案例,我不会比使用 REST 时更好。 @BrandonOlivier 你找到答案了吗?我面临同样的问题 - 必须绘制出每个嵌套案例。 恐怕我最终放弃了 GraphQL 以加快我的项目。 @BrandonOlivier 我认为这不准确。使用 REST 端点,您可能需要执行多个 API 调用来获取与该事件关联的事件和用户,而使用 GraphQL 您只需执行一个。关于您的问题,您可能不必为用户创建解析器。如果与事件存在数据库关系,您可以检索事件用户关系。如果用户总是被事件调用,那可能是最有效的。

以上是关于TypeORM Apollo 嵌套查询解析器的主要内容,如果未能解决你的问题,请参考以下文章

上下文未传递给嵌套的 Apollo GraphQL 解析器

NestJS 中的 TypeORM - 如何在实体中获取 MySQL 嵌套对象并对子关系进行“位置”查询?

嵌套在类型中的 Apollo 服务器订阅

具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询

使用 appsync 解析器、aws dymaodb 的嵌套查询

Apollo GraphQL 中带有变量的嵌套查询