【问题标题】:GraphQL List or single objectGraphQL 列表或单个对象
【发布时间】:2017-01-29 07:35:01
【问题描述】:

我遇到了以下“问题”。我已经习惯了这样的 API。

/users
/users/{id}

第一个返回用户列表。第二个只是一个对象。我希望 GraphQL 也一样,但似乎失败了。我得到了以下架构

var schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'Query',
    fields: {
      users: {
        type: new GraphQLList(userType),
        args: {
          id: {type: GraphQLString}
        },
        resolve: function (_, args) {
          if (args.id) {
            return UserService.findOne(args.id).then(user => [user]);
          } else {
            return UserService.find()
          }
        }
      }
    }
  })
});

如何修改用户类型以返回列表或单个对象?

【问题讨论】:

    标签: javascript graphql


    【解决方案1】:

    您不应将一个字段用于不同目的。取而代之的是,制作两个字段。一个用于单个对象,另一个用于对象列表。这是更好的实践和更好的测试

    fields: {
        user: {
            type: userType,
            description: 'Returns a single user',
            args: {
                id: {type: GraphQLString}
            },
            resolve: function (_, args) {
                return UserService.findOne(args.id);
            }
        },
        users: {
            type: new GraphQLList(userType),
            description: 'Returns a list of users',
            resolve: function () {
                return UserService.find()
            }
        }
    }
    

    【讨论】:

    • 你是对的,只是小修正,然后(user => [user]) 不再需要了:)
    • 我有相同的解决方案...但使用相同的名称users 不可能吗?
    • 我已尝试重现您的架构并且一切正常。在你的 [user] 结果上尝试 console.log 看看你得到了什么
    【解决方案2】:

    上面的答案是正确的,通常的做法是加单复数形式的查询。但是,在大型模式中,这可能会重复很多逻辑,并且可以稍微抽象一下,例如使用 Node 接口和节点、节点查询。但是节点查询通常使用 ids 作为参数(在 Relay 中,即node Fields),但是您可以构建自己的抽象方式来获取,这样您就只有带有一些类型参数的节点,并且基于此您可以说出什么类型要获取的列表。但是,更简单的方法是仅复制每种类型的逻辑并使用单数和复数形式的查询,并对每种类型执行与上述相同类型的查询或在此code snippet 中。有关在查询中实现 GraphQL 列表修饰符甚至作为突变输入的更多详细说明。我刚刚发布了article

    【讨论】:

    • 两者都使用相同的端点,唯一的区别是我们传递了一个 id,如果没有我们需要列出项目
    猜你喜欢
    • 2017-07-08
    • 2019-04-20
    • 2010-09-28
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多