1

我是 GraphQL 新手,不知道如何在子字段上实现查询。

例如,假设我们有以下类型和查询:

type Author {
    joinedDate: String,
    quote: String
}

type Post {
    id: String,
    author: Author,
    text: String,
    timeStamp: String,
    location: String
}

type Query {
    posts(authorId: String): [Post]
}

然后,客户可以提出如下请求:

// gets everything
{
    posts(authorId: Steve)
}
// just gets time, text, and location
{
    posts(authorId: Steve) {
        timeStamp
        text
        location
    }
}    

然后可以像这样实现根对象:

const root = {
    posts: (authorId) => {
        return dataService.getPosts(authorId)
    }
}

我的问题是您将如何在子字段上实现查询/过滤器。例如:

// just gets time, text, and location for specific date range
{
    posts(authorId: Steve) {
        timeStamp(minDate: 01012015, maxDate: 10102018)
        text
        location
    }
}

我将如何定义该根方法?我是否需要在postsroot 方法中手动过滤完整的帖子列表?

const root = {
    // would this method even have access to the date args?
    posts: (authorId, minDate, maxDate) => {
        const newList = filterTheList(
            dataService.getPosts(authorId),
            minDate,
            maxDate
        )
        return newList
    }
}   

谢谢阅读!

4

1 回答 1

1

如果dataService.getPosts()没有为您提供某种方式来传递过滤器并且您无法修改该代码,那么,是的,您必须自己过滤结果,然后再将它们返回到解析器中。

否则,如果dataService只是查询数据库,您只需重构getPosts()以根据传递给它的参数将数据库查询限制为一个子集。

如果您试图将返回的帖子限制在特定的日期范围内,那么为您的时间戳字段设置参数minDate并没有任何意义。maxDate相反,它们应该是您posts领域的参数,就像authorId.

唯一应该向字段添加参数的时候是当您想要更改该字段的解析器的行为时。例如,假设您的 Post 类型上有一个字段,例如commenters. 帖子的评论者列表不会作为您通过调用获得的帖子列表的一部分返回getPosts()——相反,您需要为每个帖子获取它。如果您想过滤或以其他方式更改获取或返回评论者列表的方式,那么您将向该commenters字段添加一个或多个参数。

为了更直接地解决您的问题,传递给您的解析器的参数只是该特定字段的参数 - 您的解析器posts不会获取其下字段的参数。

最后但同样重要的是,在编写解析器时,请记住传递给它的参数。如果您使用根值来定义解析器,则解析器如下所示:

const root = {
  posts: (args, context, info) => {
    //args.authorId
  }
}

请注意,您的参数只有一个对象——它们不会单独传递给解析器。

当您使用根值来定义解析器时,您将无法为除查询、变异和订阅之外的任何类型的字段定义解析器。我鼓励你考虑使用graphql-tools' makeExecutableSchema。它简化了架构的构建,同时仍然提供了灵活性。

使用 makeExecutableSchema,您的解析器将如下所示:

const resolvers = {
  Query: {
    posts: (obj, args, context, info) => {}
  },
  Post: {
    someField: (obj, args, context, info) =>{
      //obj here will be the obj a specific Post was resolved to
    }
  }
}
于 2017-10-20T04:08:53.987 回答