首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >graphql-js查询可以是任意顺序的,但显然输入类型不能。

graphql-js查询可以是任意顺序的,但显然输入类型不能。
EN

Stack Overflow用户
提问于 2017-01-05 23:21:24
回答 1查看 401关注 0票数 1

试图遵循嵌套突变的示例

看起来,使用graphql-js,我可以为查询提供前向引用,但不能对突变进行引用。

例如,如果我有两种类型,PersonUser,那么查询具有前向引用是合法的:

代码语言:javascript
复制
const UserType = new graphql.GraphQLObjectType({
  name: 'UserType',
  description: 'A user',
  fields: () => ({
    uuid: {type: (graphql.GraphQLString)},
    person: {
      type: PersonType,
      resolve: (root, {args}, request ) => {
        return db.personGetByUUID(request.user, root.person);
      }
    },
  })
});
const PersonType = new graphql.GraphQLObjectType({ [...]

然而,这种前向引用对于突变是不合法的:

代码语言:javascript
复制
const UserInputType = new graphql.GraphQLInputObjectType({
  name: 'UserInputFields',
  description: 'input type for creation or update of a user',
  fields: {
    uuid: {type: (graphql.GraphQLString)},
    person: {type: (PersonInputType)},
  }
});

const PersonInputType = new graphql.GraphQLInputObjectType({ [...]

如果我尝试这样做,就会得到错误ReferenceError: PersonInputType is not defined

我的理解是,GraphQL允许您从图中的任何节点开始创建一个逻辑树视图,用于查询或更改图形。这似乎适用于查询,但不适用于突变。

这是缺少的特性,Javascript的限制,还是我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-06 06:11:27

其实你可以。

fields类型上的GraphQL属性可以是对象,也可以是返回对象的函数。当您需要引用尚未定义的类型时,只需将整个field对象包装在函数中即可。就像定义UserType时所做的一样。

代码语言:javascript
复制
const UserInputType = new graphql.GraphQLInputObjectType({
  name: 'UserInputFields',
  description: 'input type for creation or update of a user',
  fields: () => ({ // <----------- function that returns the object
    uuid: {type: (graphql.GraphQLString)},
    person: {type: (PersonInputType)},
  })
});

const PersonInputType = new graphql.GraphQLInputObjectType({ [...]

引用文档的话

当两个类型需要相互引用,或者一个类型需要在字段中引用自己时,您可以使用函数表达式(也称为闭包或thunk)来延迟地提供字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41496464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档