无法在 GraphQL Schema 中嵌套类型

Posted

技术标签:

【中文标题】无法在 GraphQL Schema 中嵌套类型【英文标题】:Unable to nest Types in GraphQL Schema 【发布时间】:2017-10-29 03:32:04 【问题描述】:

我很难找出为什么我在“page/pages”上的 PageType 给出“PageType is not defined”,我想有什么不同的方式来引用它吗?我有一种感觉,这可能是对如何引用其他类型的简单忽略

const PageType = new GraphQLObjectType(
  name: 'Page',
  fields: 
    _id:  type: new GraphQLNonNull(GraphQLID) ,
    title:  type: GraphQLString ,
    subtitle:  type: GraphQLString ,
    description:  type: GraphQLString ,
    page: 
      type: PageType
    
    pages: 
      type: new GraphQLList(PageType),
    
  ,
);

错误(主要是帮助别人搜索类似问题):

ReferenceError: PageType is not defined
    at Object.<anonymous> (H:\Coding\Projects\react-starter-kit\build\webpack:\src\data\types\PageType.js:50:1)
    at __webpack_require__ (H:\Coding\Projects\react-starter-kit\build\webpack:\webpack\bootstrap 8ce5b4572987765a465d:19:1)
    at Object.<anonymous> (H:\Coding\Projects\react-starter-kit\build\server.js:731:74)
    at __webpack_require__ (H:\Coding\Projects\react-starter-kit\build\webpack:\webpack\bootstrap 8ce5b4572987765a465d:19:1)
    at Object.<anonymous> (H:\Coding\Projects\react-starter-kit\build\webpack:\src\data\schema.js:1:1)
    at __webpack_require__ (H:\Coding\Projects\react-starter-kit\build\webpack:\webpack\bootstrap 8ce5b4572987765a465d:19:1)
    at Object.<anonymous> (H:\Coding\Projects\react-starter-kit\build\server.js:1098:72)
    at __webpack_require__ (H:\Coding\Projects\react-starter-kit\build\webpack:\webpack\bootstrap 8ce5b4572987765a465d:19:1)
    at Object.<anonymous> (H:\Coding\Projects\react-starter-kit\build\server.js:7455:18)
    at __webpack_require__ (H:\Coding\Projects\react-starter-kit\build\webpack:\webpack\bootstrap 8ce5b4572987765a465d:19:1)
    at H:\Coding\Projects\react-starter-kit\build\webpack:\webpack\bootstrap 8ce5b4572987765a465d:65:1
    at Object.<anonymous> (H:\Coding\Projects\react-starter-kit\build\server.js:71:10)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)

【问题讨论】:

【参考方案1】:

该错误非常简单。您尝试在进行分配之前引用 PageType。一个最小的例子也会发生同样的错误:

const foo = 
  innerFoo: foo // error: foo is not defined

这就是为什么在这些递归情况下使用函数(通常称为 thunk)的原因

const foo = 
  innerFoo: () => foo

foo.innerFoo() 被调用时,foo 将已经被定义并且这将起作用。出于这个原因,GraphQL 模式支持将字段创建为函数。

const FooType = new GraphQLObjectType(
  name: 'Foo',
  fields: () => ( // fields is a "thunk"
    foo: 
      type: FooType
    ,
    foos: 
      type: new GraphQLList(FooType),
    
  ),
)

【讨论】:

非常感谢您,效果很好。详细的回答大大增加了我对语言的理解

以上是关于无法在 GraphQL Schema 中嵌套类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GraphQL 模式中定义嵌套枚举类型

我无法在 typeDefs 中导入 schema.graphql 文件:找不到以下指针的任何 GraphQL 类型定义:

GraphQL/Relay Schema 无法在“CreateLinkPayload”类型上查询字段“store”

Schema Generator 无法确定 DTO 中自定义对象的 GraphQL 输出类型

嵌套错误:无法确定 getProducts 的 GraphQL 输出类型

嵌套js代码中可空值的可空数组首先graphql