【发布时间】:2019-12-03 19:03:40
【问题描述】:
我有这样的非常常见的 GraphQL 架构(伪代码):
Post {
commentsPage(skip: Int, limit: Int) {
total: Int
items: [Comment]
}
}
为了避免在请求多个Post 对象时出现n+1 问题,我决定使用Facebook 的Dataloader。
由于我正在开发 Nest.JS 3 层分层应用程序(Resolver-Service-Repository),我有一个问题:
我应该使用 DataLoader 包装我的存储库方法还是应该使用 Dataloder 包装我的服务方法?
下面是我的服务方法示例,它返回Comments 页面(即从commentsPage 属性解析器调用此方法)。在服务方法内部,我使用了 2 个存储库方法(#count 和 #find):
@Injectable()
export class CommentsService {
constructor(
private readonly repository: CommentsRepository,
) {}
async getCommentsPage(postId, dataStart, dateEnd, skip, limit): PaginatedComments {
const counts = await this.repository.getCount(postId, dateStart, dateEnd);
const itemsDocs = await this.repository.find(postId, dateStart, dateEnd, skip, limit);
const items = this.mapDbResultToGraphQlType(itemsDocs);
return new PaginatedComments(total, items)
}
}
所以我应该为每个存储库方法(#count、#find 等)创建单独的 Dataloader 实例,还是应该只用 Dataloader 包装我的整个服务方法(所以我的 commentsPage 属性解析器只能与 Dataloader 一起使用没有服务)?
【问题讨论】:
标签: graphql nestjs dataloader