新 GraphQL buildSchema 的嵌套查询

Posted

技术标签:

【中文标题】新 GraphQL buildSchema 的嵌套查询【英文标题】:Nested query for the new GraphQL buildSchema 【发布时间】:2017-01-30 21:03:46 【问题描述】:

如何使用新的 GraphQL Schema 语言为我的 friendList 制作解析器? friendList 有一个人 _id 数组。

我的新人使用 GraphQL Schema 语言输入:

const schema = buildSchema(`
  type People 
    _id: String
    firstName: String
    lastName: String
    demo: String
    friendList: [People]
  
  type Query 
    getPeople(_id: String): People
  
`);

我的老人用 GraphQLObjectType 打字:

const PeopleType = new GraphQLObjectType(
  name: 'People',
  fields: () => (
    _id: 
      type: GraphQLString,
    ,
    firstName: 
      type: GraphQLString,
    ,
    lastName: 
      type: GraphQLString,
    ,
    friendList: 
      type: new GraphQLList(PeopleType),
      // pass @friends parentValue
      resolve: ( friends ) 
        return People.find( _id:  $in: friends  ).then(res => res);
    ,
  ),
);

我想实现这个查询:


  people(_id: "ABC123") 
    firstName
    lastName
    friendList 
      firstName
      lastName
    
  

【问题讨论】:

你找到答案了吗?我自己现在正在努力解决这个问题。 【参考方案1】:

您的解析器应该返回一个新的类实例,如更新的 GraphQL 文档中所述:http://graphql.org/graphql-js/object-types/。

class People 
  friendList () 

var rootValue = 
  getPeople: function () 
    return new People();
  

【讨论】:

问一个简单的问题..如果朋友列表是另一种类型,例如(朋友)朋友列表:朋友。你如何在 person 类中解决这个问题。 @kweku360 friendList 表示字段解析器。我鼓励您查看contextable.js。它现在可以用作 GraphQL rootValue 解析器。【参考方案2】:

我找不到使用 graphql-js 的方法,所以我改用 Apollo 的人提供的类似实现,称为 graphql-tools。

http://dev.apollodata.com/tools/graphql-tools/generate-schema.html

他们有一个名为 makeExecutableSchema 的函数,该函数采用以 GraphQL Schema 语言编写的模式并将其与(嵌套的)解析器函数相结合。这解决了问题,如果您的代码使用 GraphQL Schema 语言,集成起来实际上非常简单。

他们还有另一个不可知的工具来公开这个新模式,它取代了 express-graphql,它的 GraphQL 服务器:

http://dev.apollodata.com/tools/graphql-server/index.html

查看文档,希望这能让您灵活地使用 GraphQL Schema 语言语法编写复杂的代码!

【讨论】:

以上是关于新 GraphQL buildSchema 的嵌套查询的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL buildSchema 与 GraphQLObjectType

gql 和 buildSchema 有啥区别?

如何使用 apollo 服务器从变量运行 graphql 查询

GraphQL 教程 - 预期未定义为 GraphQL 模式

在graphql中合并不同的模式

如何使用自定义对象编写 graphql 查询