使用graphql的nestJS中的解析器/服务有啥区别?

Posted

技术标签:

【中文标题】使用graphql的nestJS中的解析器/服务有啥区别?【英文标题】:What is the difference of resolver/service in nestJS using graphql?使用graphql的nestJS中的解析器/服务有什么区别? 【发布时间】:2021-04-24 04:52:36 【问题描述】:

我不明白在使用 graphQl 和 mongoDB 的 nestJS 应用程序中 resolverservice 之间的区别。

我发现了这样的例子,其中解析器只调用一个服务,所以解析器函数总是很小,因为它们只是调用一个服务函数。但是有了这种用法,我根本不明白解析器的目的......

@Resolver('Tasks')
export class TasksResolver 
  constructor(
    private readonly taskService: TasksService
  ) 

  @Mutation(type => WriteResult)
  async deleteTask(
    @Args('id') id: string,
  ) 
    return this.taskService.deleteTask(id);
  



@Injectable()
export class TasksService 
  deleteTask(id: string) 
    // Define collection, get some data for any checking and then update dataset
    const Tasks = this.db.collection('tasks')
    const data = await Task.findOne( _ id: id )
    let res

    if (data.checkSomething) res = Task.updateOne( _id: id ,  $set:  delete: true  )

    return res
  

另一方面,我可以将所有服务逻辑放入解析器中,并将 mongodb 部分留在服务中,但是服务很小,只需替换一个简单的 mongodb 调用。那么我为什么不把它也放到解析器中呢。

@Resolver('Tasks')
export class TasksResolver 
  constructor(
    private readonly taskService: TasksService
  ) 

  @Mutation(type => WriteResult)
  async deleteTask(
    @Args('id') id: string,
  ) 
    const data = await this.taskService.findOne(id)
    let res

    if (data.checkSomething) 
      const update =  $set:  delete: true  
      res = this.taskService.updateOne(id, update)
    

    return res
  



@Injectable()
export class TasksService 
  findOne(id: string) 
    const Tasks = this.db.collection('tasks')
    return Task.findOne( _ id: id )
  

  updateOne(id: string, update) 
    const Tasks = this.db.collection('tasks')
    return Task.updateOne( _ id: id , update)
  

解析器和服务的正确用法是什么?在这两种情况下,一个部分几乎为每个函数保留一个衬里,那么我为什么要拆分它呢?

【问题讨论】:

【参考方案1】:

你说得对,这是一个非常线性的调用,背后没有太多逻辑,但想法是分离每个类的关注点。解析器,很像 REST 或 RPC 控制器,应该充当业务逻辑的网关,以便可以轻松地在服务器的其他部分重用或调用逻辑。如果您有一个带有 RPC 或 REST + GQL 组合的混合服务器,您可以重用该服务以确保 REST 和 GQL 获得相同的回报。

最后,这取决于您对您想要做什么的选择,但是将解析器与服务分开(具有瘦网关和胖逻辑类)是 Nest 对正确设计的意见 .

【讨论】:

如果我理解正确,我的第一个例子是nestJS 会“推荐”它的方式(瘦解析器)?但最后没关系? 差不多。当然,随着逻辑的增长,为了测试目的和组织目的,将其保留在同一个类中会更容易,但最终它是你的代码。 你可能会争论 YAGNI,但我想如果需要的话,如果你从一开始就将它们分开,你会更快乐。

以上是关于使用graphql的nestJS中的解析器/服务有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Nestjs(graphql)中不同类型的异常处理

Nestjs中多个graphql解析器实现的问题

在 NestJS + GraphQL 中实现“命名空间类型”解析器

NestJS 5 GraphQL 错误查询在解析器中定义,但不在模式中

GraphQL Schema 未使用 NestJS 更新(代码优先方法)

如何在nestjs graphql中实现用户保护