graphql - Apollo GraphQL 服务器;设置上下文以处理由已触发订阅触发的请求

标签 graphql apollo-server graphql-subscriptions

我了解如何在创建 GraphQL 服务器时设置上下文对象,例如

const app = express();
app.use(GRAPHQL_URL, graphqlExpress({
            schema,
            context: {
                foo: 'bar'
            },
    }));

以便在处理传入请求时将上下文对象传递到我的解析器。

但是,当解析器被订阅触发时,我没有看到这个上下文对象(即客户端订阅 GraphQL 订阅,并定义订阅触发时要发送给它们的数据的形状);在这种情况下,上下文似乎是一个空对象。

在 PubSub.publish() 调用之后调用解析器时,有没有办法确保正确设置我的上下文对象?

最佳答案

我猜你正在使用包 subscription-transport-ws。在这种情况下,可以在不同的执行步骤中添加上下文值。 参见 API .两种可能的情况

  1. 如果您有某种身份验证。您可以在 onConnect 执行步骤的上下文中添加查看器。这是在第一次连接到 websocket 时完成的,并且在连接关闭并再次打开之前不会改变。参见 example .

  2. 如果您想更动态地添加上下文,您可以在执行步骤之前添加一种中间件。它可能如下所示:

const middleware = (args) => new Promise((resolve, reject) => {
  const [schema, document, root, context, variables, operation] = args;
  context.foo = "bar"; // add something to context
  resolve(args);
})

subscriptionServer = SubscriptionServer.create({
  schema: executable.schema,
  subscribe,
  execute: (...args) => middleware(args).then(args => {
    return execute(...args);
  })
}, {
  server: websocketServer,
  path: "/graphql",
}, );

关于graphql - Apollo GraphQL 服务器;设置上下文以处理由已触发订阅触发的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45574592/

相关文章:

python-3.x - Python Graphite 烯与 Apollo Federation 集成时出现问题

graphql - 如何同时使用模拟的 graphql API 和外部服务的 GraphQL 端点

websocket - 带有 WebSocket 的原始 javascript GraphQL 订阅不起作用

graphql - 订阅一项 GraphQL 项目

python - 如何在python的graphql查询中修复 'parse error on (VAR_SIGN)'

python - TheGraph Uniswap 子图返回奇怪的交易量和流动性值

node.js - 在ApolloServer中支持异议 `$formatJson`

graphql - 为什么GraphQL查询返回null?

node.js - 无法通过中间件检索添加到请求对象的值

reactjs - React Apollo 订阅中的第一个对象没有合并到以前的数据中,它实际上被删除了