GraphQL同类型节点分支级过滤机制探究及JSON变体疑问
关于GraphQL分支级定制过滤的疑问与场景探讨
背景
我正在为学习目的开发GraphQL的JSON变体,想深入探究GraphQL查询的可能性。一直以来,我对GraphQL中同一类型的节点在不同位置可支持不同查询输入参数/过滤逻辑的实现方式感到困惑。
现有标准的解析器系统示例:
const resolvers = { Query: { author: (parent, args) => { // 实现根据ID获取作者的逻辑 }, post: (parent, args) => { // 实现根据ID获取文章的逻辑 }, }, Author: { posts: (author) => { // 实现获取该作者所有文章的逻辑 }, }, Post: { comments: (post) => { // 实现获取该文章所有评论的逻辑 }, }, Comment: { author: (comment) => { // 实现获取该评论作者的逻辑 }, }, };
我构想的查询示例:
query { author(id: "1") { id name posts(limit: 10) { id title content comments(limit: 10) { id text author { id name posts(createdAtGt: someDate) { id title content } } } } } }
核心疑问
1. 为何需要Comment.author解析器,而非直接复用Query.author?
2. 是否存在需要对author.posts和comment.author.posts采用完全不同过滤规则的场景,且不允许跨上下文使用过滤方式?
方案取舍对比
我正在对比两种实现方案:
- 方案1:同一类型节点仅允许一种统一的过滤逻辑
- 方案2:按查询树分支定制独特的输入/过滤功能,同一类型节点可根据所在位置拥有多种过滤机制
如果方案2在复杂生产环境中可行,会面临多个解析器重复实现基础逻辑的问题,因此我构想了一种JSON式解析器结构来实现分支级定制:
{ author: { resolve(parent, args) { // 根据ID查找作者 }, children: { posts: { resolve(parent) { // 根据作者ID查找文章,仅在此处允许limit参数 }, children: { comments: { resolve(parent) { // 根据文章ID查找评论 }, children: { author: { resolve(parent) { // 根据评论的作者ID查找作者 }, children: { posts: { resolve(parent) { // 根据作者ID查找文章,但仅允许按日期大于指定值过滤 } } } } } } } }, comments: { resolve(parent) { // 根据作者ID查找评论 }, children: { author: { resolve(parent) { // 此处逻辑不同,仅返回名字以“A”开头的作者 }, children: { posts: { resolve(parent) { // 此处也有另一种变体逻辑...可扩展更多定制场景 } } } } } } } } }
最终问题
请问GraphQL生态中是否存在此类分支级定制过滤的场景?若存在请给出中等复杂度的示例;若不存在,请说明原因。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

