【发布时间】:2020-05-31 07:57:27
【问题描述】:
我正在尝试实施某种基本的社交网络项目。它有 Posts、Comments 和 Likes 和其他任何东西一样。
- 一个帖子可以有多个 cmets
- 一个帖子可以有很多赞
- 一篇文章可以有一个作者
我在客户端应用程序上有一个/posts 路由。它通过分页列出Posts 并显示它们的title、image、authorName、commentCount 和likesCount。
graphql 查询是这样的;
query {
posts(first: 10, after: "123456") {
totalCount
edges {
node {
id
title
imageUrl
author {
id
username
}
comments {
totalCount
}
likes {
totalCount
}
}
}
}
}
我正在使用apollo-server、TypeORM、PostgreSQL 和 dataloader。我使用dataloader 获取每个帖子的author。我只是将请求的authorIds 与dataloader 批处理,从PostgreSQL 获取authors 与where user.id in authorIds 查询,将查询结果映射到每个authorId。要知道,dataloader最基本的用法。
但是当我尝试查询每个post 下的comments 或likes 连接时,我卡住了。如果没有分页,我可以使用相同的技术并为他们使用postId。但是现在我必须包含分页的过滤器参数。对于某些where 条件,可能还有其他过滤器参数。
我找到了数据加载器的cacheKeyFn 选项。我只是为传递给数据加载器的过滤器对象创建一个字符串键,它不会复制它们。它只是将唯一的传递给batchFn。但是我无法使用TypeORM 创建一个sql 查询来分别获取每个first、after、orderBy 参数的结果并将结果映射回调用数据加载器的函数。
我搜索了spectrum.chat 源代码,我认为它们不允许用户查询嵌套连接。还尝试了 Github GraphQL Explorer,它可以让您查询嵌套连接。
有没有推荐的方法来实现这一点?我了解如何将object 传递给dataloader 并使用cacheKeyFn 对它们进行批处理,但我无法弄清楚如何在一个查询中从PostgreSQL 获取结果并将结果映射为从加载程序返回。
谢谢!
【问题讨论】:
-
嘿@Onur Önder,您是否设法找到了一个可行的解决方案来解决这个问题?您有示例公共存储库吗?这对我有很大帮助!也许你也可以看看这个问题:stackoverflow.com/questions/58089839
-
我使用了一个简单的解决方案,我发现它现在对我有用。你可以在这里找到一个例子:github.com/onderonur/post-gallery/blob/master/api/src/db/entity/…我没有时间解释清楚,对不起。但我也告诉了这个答案的 cmets 步骤:stackoverflow.com/a/60244734/10876256 我希望有一个更简单的解决方案。为每个连接创建相同的结构有点费时。但我想我至少找到了解决方案 :) 谢谢!
标签: postgresql graphql apollo typeorm dataloader