使用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 应用程序中 resolver 和 service 之间的区别。
我发现了这样的例子,其中解析器只调用一个服务,所以解析器函数总是很小,因为它们只是调用一个服务函数。但是有了这种用法,我根本不明白解析器的目的......
@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 5 GraphQL 错误查询在解析器中定义,但不在模式中