GraphQL:如何处理在自己的类型定义中引用类型?

Posted

技术标签:

【中文标题】GraphQL:如何处理在自己的类型定义中引用类型?【英文标题】:GraphQL: How to handle referencing a type within its own type definition? 【发布时间】:2021-08-31 10:03:53 【问题描述】:

假设我有以下内容:

type User 
  id: Int!
  name: String
  dob: String
  friends: [User]


Query 
  user(id: Int!): User

在我看来,我刚刚创造了无限递归的潜力:

query GetUser($userId: Int!) 
  user(id: $userId) 
    friends 
      name
      friends 
        name
        friends 
          name
          ...etc
        
      
    

  

在我的 user 解析器中,我将如何防止这种情况发生?

【问题讨论】:

这不是无限递归,因为您的查询只加载三个嵌套级别,而不是无限数量。您能否澄清一下您具体关注的是什么? 通常计算/限制最大深度级别/复杂性成本 - 根本没有在类型系统中定义 - 实现相关细节 【参考方案1】:

这可能是一个潜在问题,但您可以使用自定义验证来阻止此类请求,例如 https://github.com/stems/graphql-depth-limit

import depthLimit from 'graphql-depth-limit'
import express from 'express'
import graphqlHTTP from 'express-graphql'
import schema from './schema'

const app = express()

app.use('/graphql', graphqlHTTP((req, res) => (
  schema,
  validationRules: [ depthLimit(10) ]
)))

【讨论】:

以上是关于GraphQL:如何处理在自己的类型定义中引用类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 GraphQL 中的嵌套输入

在 Grafana 中,我们如何处理在图表/面板中返回 0 行的查询?

如何处理在 Angular CLI 中安装对等依赖项?

如何处理在域模型中没有表示的查询?

如何处理在 php mysql 中返回多个值的内部查询?

Node.js:如何处理在字典中查找同名的不同城市?