【问题标题】:GraphQL not loading children listsGraphQL 不加载子列表
【发布时间】:2017-11-06 23:05:53
【问题描述】:

我开始编写冗长的 GraphQL 并切换到 graphql-toolsmakeExecutableSchema,随着更改,它将加载对 user(id: "N")usersgroup(id: "N")groups 的查询,但是,嵌套列表只需返回"id": null。我觉得我必须在某个地方有一个小错误,但我没有看到它:

const { makeExecutableSchema } = require('graphql-tools')

const db = require('./db')

const typeDefs = `
  type User {
    id: String
    first_name: String!
    last_name: String!
    email: String!
    friends: [User!]
    groups: [Group!]
  }

  type Group {
    id: String
    name: String!
  }

  type Query {
    users: [User!]!
    user(id: String!): User
    groups: [Group!]!
    group(id: String!): Group
  }
`

const resolvers = {
  Query: {
    users: db.readAllUsers,
    user: (root, args, { loaders }) => loaders.user.load(args.id),
    groups: db.readAllGroups,
    group: (root, args, { loaders }) => loaders.group.load(args.id)
  }
}

module.exports = makeExecutableSchema({ typeDefs, resolvers })

任何帮助将不胜感激!


编辑:澄清一下,here's what the data source looks like

【问题讨论】:

    标签: node.js graphql


    【解决方案1】:

    您已经为查询定义了解析器,而只是查询类型上的字段。但是,对于 User 类型的 group 字段,您没有任何解析器,因此 GraphQL 回退到使用该字段的默认解析器。由于 Object User 上的属性字段解析为只是一个 id 数组,GraphQL 不知道如何理解它——毕竟,你告诉它组将是一个对象数组。

    您需要为 groups 字段添加解析器,并将该数组转换为将解析为 Group 对象数组的 Promise:

    const resolvers = {
      Query: {
        users: db.readAllUsers,
        user: (root, args, { loaders }) => loaders.user.load(args.id),
        groups: db.readAllGroups,
        group: (root, args, { loaders }) => loaders.group.load(args.id)
      },
      User: {
        groups: ({ groups }, args, { loaders }) => {
          return Promise.all(groups.map(id => loaders.group.load(id)))
        }
      }
    }
    

    【讨论】:

    • 我应该澄清在返回的对象上有一个groups property
    • 那么,在上面的示例中,我可以获取用户的 id,我是否需要手动获取 user.groups 并遍历那些以填充它?
    • 是的。我修改了答案以反映这一点。
    • 谢谢!它只是“点击”看到您的代码,我没有考虑通过 User.groups 上的 args 传递的完整对象。
    • 最后一个症结所在:有没有办法在User.groups 解析器中使用加载器?我没有看到正在传递的上下文...
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 2017-12-27
    • 2021-05-05
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2017-08-02
    相关资源
    最近更新 更多