【问题标题】:Get query/mutation operation name获取查询/变异操作名称
【发布时间】:2019-11-24 17:22:54
【问题描述】:

如何在上下文中获取操作名称?在解析器中,我可以使用 info 参数得到它。

import { ApolloServer } from 'apollo-server'

const server = new ApolloServer({
  context: ({ req }) => {
    // Get query/mutation operation name like getAllUsers
  }
})

server.listen()

【问题讨论】:

  • 您可以传入一个虚拟(但格式正确)的请求 - 或一个真实的请求,就此而言,检查 req 对象并相当容易地找出用于隔离信息的键你在追求吗?
  • @Jaxx 抱歉,req 太大。乍一看,我没有找到任何有用的东西。
  • 您可能可以定位req.body,因为我很确定您的操作名称会出现在此处,这会减少输出。此外,您可以将服务器进程输出重定向到文件,例如 npm run start > output.txt,运行您的请求,停止 (ctrl+c) 服务器,然后在文件中搜索您的操作名称。

标签: apollo apollo-server


【解决方案1】:

使用我评论中建议的技术,我能够检索到操作名称。

假设您有以下查询:

query foo {
  baz {
    id
    name
  }
}

req.body 有两个相关的键:

  1. req.body.query 以字符串格式保存整个查询,保留空格和回车。虽然您可以从该字符串中检索操作名称,但它需要一些字符串操作;即,将字符串转换为对象,然后获取根级键(如果您在单个查询中触发多个操作,则可以是多个)。在上面的示例中,此键将包含以下字符串:'query foo {\n baz {\n id\n name\n }\n}'

  2. req.body.operationName 保存您提供查询的名称IF您命名它。在上面的示例中,此键将保存 'foo'not 'baz' 这是 实际 操作的名称)。但是,您可以通过根据查询包含的操作仔细命名查询来决定利用此功能(但是,如果您在一个查询中触发多个操作,这将不起作用)。如果您没有为查询命名,则此字段包含 null

编辑:请参阅How to parse GraphQL request string into an object 这里的 SO,了解将方法 1 中检索到的字符串转换为 JS 对象并检索您的实际操作名称的方法。

进一步考虑

例如,方法 2 确实适用于调试目的。假设您要记录特定查询的变量,您可以为其命名并执行以下操作:

const server = new ApolloServer({
  context: ({ req }) => {
    if (req.body.operationName === 'debugMe') {
      console.log(req.body.variables)
    }
  }
})

但是,由于方法 2 依赖于客户端命名查询,它不能可靠地用于业务逻辑目的。无论在客户端如何形成查询,只有方法 1 会正确检索操作名称。

【讨论】:

    【解决方案2】:

    传递给 context 的 req 包含 req.body.query,但是在使用 PostMan 发送 GraphQL 查询进行测试时,我发现我的 Apollo GraphQL 服务器的 req 参数不包含查询的名称(即使我将其命名为上面正确指出的 Thomas Heennes 的初始查询声明)。

    不过,我的 req 对象确实包含 req.body.variables。

    为了获取查询名称,我从正文中提取了前 40 个字符。您可以将其解析为第一个 {( 或回车,但我只想能够查看查询/突变是什么,所以这对我有用:

    context: async ({req, connection}) => {
          ...
          ...
          let query = null;
          // mutation or query, not a subscription:
          const bodyQuery = req.body && req.body.query;
          if (bodyQuery) {
            query = req.body.query.substring(0,40);
          } else {
            query='No query passed in req body';
          }
          let variables = null;
          if (req.body.variables) {
            variables = req.body.variables;
          }
    

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      相关资源
      最近更新 更多