获取 query/mutation 操作名称

Get query/mutation operation name

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

import { ApolloServer } from 'apollo-server'

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

server.listen()

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

假设您有以下查询:

query foo {
  baz {
    id
    name
  }
}

req.body 有两个相关的键:

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

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

编辑:请参阅 here on SO,了解将方法 1 中检索到的字符串转换为 JS 对象并检索实际操作名称的方法。

进一步考虑:

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

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

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

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

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

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

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