相关疑难解决方法(0)

从 graphql 获取解析器级别的请求字段

来自 graphql 模式的书籍模型

type Book {
  id: ID
  name: String
  pageCount: Int
  author: Author
}

Run Code Online (Sandbox Code Playgroud)

所以我有一个 Book 解析器

type Book {
  id: ID
  name: String
  pageCount: Int
  author: Author
}

Run Code Online (Sandbox Code Playgroud)

效果很好。

现在假设我正在使用这个 graphql 查询,它只请求 Book 的一个字段

{
  bookById(id: "someId") {
    name
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,如何获取有关请求字段的 bookById 方法级别的信息(在本例中仅是名称字段)?这对于 GraphQLQueryResolver 概念来说是可能的吗?

dataFetcher 的示例

public class BookResolver implements BookByIdQueryResolver, GraphQLQueryResolver {
    private final MockRepository mockRepository;

    public BookResolver(MockRepository mockRepository) {
        this.mockRepository = mockRepository;
    }

    @Override
    public BookTO bookById(String id) {
        return mockRepository.getBookById(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我对解析器方式感兴趣。是否可以?

graphql graphql-java graphql-java-tools

9
推荐指数
1
解决办法
4534
查看次数

apollostack/graphql-server - 如何从解析器中获取查询中请求的字段

我试图找出一种干净的方式来处理查询和mongdb投影,所以我不必从数据库中检索过多的信息.假设我有:

// the query
type Query {
  getUserByEmail(email: String!): User
}
Run Code Online (Sandbox Code Playgroud)

我有一个Useremailusername,让事情变得简单.如果我发送查询而我只想检索电子邮件,我可以执行以下操作:

query { getUserByEmail(email: "test@test.com") { email } }
Run Code Online (Sandbox Code Playgroud)

但在解析器,我的数据库查询检索依然既usernameemail,但只有其中的一个是由阿波罗服务器查询结果传回.

我只希望数据库检索查询要求的内容:

// the resolver
getUserByEmail(root, args, context, info) {
  // check what fields the query requested
  // create a projection to only request those fields
  return db.collection('users').findOne({ email: args.email }, { /* projection */ });
}
Run Code Online (Sandbox Code Playgroud)

当然问题是,获取客户端请求的信息并不是那么简单.

假设我将请求作为上下文传递 - 我考虑使用context.payload(hapi.js),它具有查询字符串,并通过各种.split()s 搜索它,但这感觉有点脏.据我所知,info.fieldASTs[0].selectionSet.selections有字段列表,我可以检查它是否存在.我不确定这是多么可靠.特别是当我开始使用更复杂的查询时.

有更简单的方法吗?

如果您不使用mongDB,则投影是您传递的另一个参数,告诉它明确要检索的内容: …

mongodb hapijs graphql apollo-server

5
推荐指数
2
解决办法
1624
查看次数

访问解析器映射模板中的请求字段

例如,当我们请求一个 GraphQL 查询时,

query GetPost {
  singlePost(id: 123) {
    id
    title
  }
}
Run Code Online (Sandbox Code Playgroud)

我们在 AWS AppSync 中配置了一个 Lambda 解析器,请求映射模板,

{
        "version" : "2017-02-28",
        "operation" : "Invoke",
        "payload": {
          "resolve": "singlePost",
          "query": $utils.toJson($context.arguments)
        }
}
Run Code Online (Sandbox Code Playgroud)

允许我们定义传递给 lambda 处理程序的事件对象。

对于上面的示例,我们的 Lambda 处理程序将使用event其中event.payload.query.id == 123等事件调用。

根据 文档,$context对象包括,

{
   "arguments" : { ... },
   "source" : { ... },
   "result" : { ... },
   "identity" : { ... },
   "request" : { ... }
}
Run Code Online (Sandbox Code Playgroud)

{代码}

也就是说,文档没有提到我可以在哪里访问 …

graphql aws-appsync

4
推荐指数
1
解决办法
797
查看次数