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

Vik*_*ikk 5 mongodb hapijs graphql apollo-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,则投影是您传递的另一个参数,告诉它明确要检索的内容:

// telling mongoDB to not retrieve _id
db.collection('users').findOne({ email: 'test@test.com' }, { _id: 0 })
Run Code Online (Sandbox Code Playgroud)

一如既往,感谢这个令人惊叹的社区.

Dan*_*scu 7

2020年1月答案

获取 GraphQL 查询中请求的字段的当前答案是使用graphql-parse-resolve-info库来解析info参数。

该库是“一个非常完整的解决方案,实际上由 postgraphile 在幕后使用”,并被另一个用于解析该领域的顶级库的作者推荐继续使用。infographql-fields


dav*_*aha 0

你当然可以。这实际上与基于 SQL 的数据库的 join-monster 包上实现的功能相同。他们的创建者有一个演讲:https://www.youtube.com/watch ?v=Y7AdMIuXOgs

查看他们的info分析代码以帮助您入门 - https://github.com/stems/join-monster/blob/master/src/queryASTToSqlAST.js#L6-L30

很想为我们 mongo 用户看到一个投影怪物包:)

更新:有一个包可以从infonpm 上创建投影对象: https: //www.npmjs.com/package/graphql-mongodb-projection

  • 链接已损坏。 (2认同)
  • 通过代码示例可以大大改善这个答案。 (2认同)