GraphQL列表或单个对象

GraphQL List or single object

本文关键字:对象 单个 列表 GraphQL      更新时间:2023-09-26

我得到了以下"问题"。我习惯使用这样的API。

/users
/users/{id}

第一个返回用户列表。第二个只有一个物体。我想与GraphQL相同,但似乎失败了。我得到了下面的Schema

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()
          }
        }
      }
    }
  })
});

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

您不应该将一个字段用于不同的目的。相反,创建两个字段。一个用于单个对象,另一个用于对象列表。这是更好的实践,更适合测试

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()
        }
    }
}

以上答案是正确的,通常的做法是添加单复数形式的查询。然而,在大型模式中,这可能会复制大量逻辑,并且可以抽象一点,例如使用Node接口和节点、节点查询。但是节点查询通常使用id作为参数(在Relay viz node Fields中),但是您可以构建自己的抽象方式来获取,这样您就可以使用带有类型参数的节点,并基于此确定要获取的列表类型。但是,更简单的方法是为每种类型复制逻辑,使用单复数形式的查询,并对每种类型执行与上述或此代码片段中相同类型的查询。有关在查询中实现GraphQL列表修饰符甚至作为突变输入的更多详细说明。我刚刚发表了这方面的文章。