【问题标题】:How to find out which mutation is being requested when configuring “Context”(Node.js, Apollo Server)配置“上下文”时如何找出请求的突变(Node.js,Apollo Server)
【发布时间】:2021-11-08 17:42:37
【问题描述】:

我想根据在 Node.js、Apollo 服务器中调用的突变添加上下文条件函数。

我将如何有效地做到这一点?

在配置上下文时,我可以访问请求正文,并且所有 graphql 请求信息都存储在“req.body.query”中,其中也包含我需要的内容。 为了利用这一点,我必须使用“graphql”模块中的“parse”函数进行解析。但我不认为这是有效的,因为现在同一个请求基本上被解析了两次(一次由我解析,一次由 Apollo Server 解析)。此外,解析结果对所有嵌套值都不是很友好。

有没有一种清晰的方法可以知道请求的突变是什么?

【问题讨论】:

    标签: graphql apollo-server


    【解决方案1】:

    一个常见的解决方案是使用操作名称。客户端可以在请求中向服务器提供一个操作名称,以识别它在做什么。

    {
      "query": "{ mutation AddToBasket($myVariable: AddToBasketInput!) { addToBasket(input: $myVariable) { id } } }",
      "operationName": "AddToBasket",
      "variables": { "myVariable": "someValue" }
    }
    

    我认为您可以像这样从正文中访问操作名称:

    const server = new ApolloServer({
      context: ({ req }) => {
        if (req.body.operationName === 'AddToBasket') {
          console.log("Found it!")
        }
      }
    })
    

    您还可以为 Apollo Server 创建一个插件,使用 didResolveOperation 事件获取操作名称值。

    export class MyPlugin implements ApolloServerPlugin {
        async requestDidStart() {
            return {
                async didResolveOperation(
                    requestContext
                ) {
                    console.log(requestContext.operationName);
                },
            }
        }
    }
    

    使用操作名称避免了解析 GraphQL 操作以确定请求中包含哪些突变的需要,但还需要客户端提供已知的操作名称值,这可能适用于您的用例,也可能不适用。

    【讨论】:

    • 感谢您的回答。不幸的是,这并不能解决我的问题,因为没有任何东西可以强制 operationName 成为实际的操作名称。它可以被称为任何东西。我正在尝试记录已请求的突变。
    猜你喜欢
    • 2018-11-30
    • 2021-09-04
    • 2017-03-16
    • 2019-12-24
    • 2019-10-02
    • 2021-05-01
    • 2020-02-01
    • 2020-02-03
    相关资源
    最近更新 更多